当前位置: 首页 > 知识库问答 >
问题:

这是“延期反模式”吗?

任飞龙
2023-03-14

我发现很难理解“延迟反模式”。我想我基本上理解它,但我还没有见过一个超级简单的例子来说明什么是服务,有不同的promise和反模式,所以我想我会试着做我自己的,但鉴于我对它的了解不够,我会首先得到一些澄清。

//url = 'data.json';

return {
    getData: function(){
        var deferred = $q.defer();

        $http.get(destinationFactory.url)
            .then(function (response) {

                if (typeof response.data === 'object') {
                    deferred.resolve(response.data);
                } else {
                    return deferred.reject(response.data);
                }
            })

            .catch(function (error) {
            deferred.reject(error);
        });

        return deferred.promise;
    }
this.var = SomeFactory.getData()
    .then(function(response) {
        //some variable = response;
    })
    .catch(function(response) {
        //Do error handling here
});

在我看来,这是一种反模式。因为最初的延期promise抓住了错误,并简单地将其吞掉。它不会返回错误,所以当调用这个“getData”方法时,我必须执行另一个catch来获取错误。

如果这不是反模式,那么有人能解释为什么两者都需要某种“回调”吗?当我第一次开始编写这个factory/directive时,我预料到必须在某个地方执行一个defffered promise,但我没有预料到必须在两边执行.catch()(也就是我在想,如果我执行somefactory.getdata(),我可以让工厂返回响应或错误,如果我执行somefactory.getdata()

共有1个答案

许出野
2023-03-14

这是“延期反模式”吗?

是的,是的。当创建一个新的冗余延迟对象以从promise链中解析时,就会发生“延迟反模式”。在您的示例中,您使用$Q为隐式返回promise的内容返回promise。您已经有了一个Promise对象($HTTP服务本身返回一个Promise),所以您只需要返回它!

下面是一个超级简单的例子,说明了带有延迟promise和反模式的服务是什么样子的,

app.factory("SomeFactory",['$http','$q']){
    return {
        getData: function(){
            var deferred = $q.defer();            
            $http.get(destinationFactory.url)
              .then(function (response) {        
                 deferred.resolve(response.data);
            })
              .catch(function (error) {
                deferred.reject(error);
            });            
            return deferred.promise;
        }
     }
}])
app.factory("SomeFactory",['$http']){
    return {
        getData: function(){
           //$http itself returns a promise 
            return $http.get(destinationFactory.url);
        }
}
this.var = SomeFactory.getData()
    .then(function(response) {
        //some variable = response;
    },function(response) {
        //Do error handling here
});

这两个例子都没有错(至少在句法上)..但是第一个是多余的..而且不需要!

希望有帮助:)

 类似资料:
  • 问题内容: 我发现很难理解“延迟反模式”。我想我基本上理解了它,但是我还没有看到一个简单的例子,说明什么是服务,具有不同的承诺和一个具有反模式的服务,所以我想尽我所能,但是看到自己不是这样超级了解这一点,我会先澄清一下。 我在工厂(SomeFactory)中具有以下内容: 我检查其对象的原因只是为了在其上添加一个简单的验证层 在下面,在我的指令中: 现在来看,这是一种反模式。因为原始的延迟承诺会捕

  • 最近我读了Mark Seemann关于Service Locator反模式的文章。 作者指出ServiceLocator是反模式的两个主要原因: > API使用问题(我对此很满意) 当类使用服务定位器时,很难看到它的依赖关系,因为在大多数情况下,类只有一个PARAMETERLESS构造函数。与ServiceLocator不同,DI方法通过构造函数的参数显式地公开依赖项,所以在IntelliSens

  • 问题内容: 以下是React中的反模式吗?我喜欢这种模式,因为当实例化一个组件时,它在静态函数中为我提供了上下文。然后,我可以导入该类并调用静态方法来修改状态。还是可以通过更好的方式来完成? 问题答案: 显然,这取决于条件,可能是一种反模式,也可能是一个错误。静态类方法不应与类实例一起使用。绑定到特定的组件实例和用途,这只能证明类是单例是合理的(尽管单例也经常是反模式)。如果期望有多个类实例,那么

  • 在软件工程中,一个反面模式(anti-pattern或antipattern)指的是在实践中明显出现但又低效或是有待优化的设计模式,是用来解决问题的带有共同性的不良方法。它们已经经过研究并分类,以防止日后重蹈覆辙,并能在研发尚未投产的系统时辨认出来。 软件设计 抽象倒置(Abstraction inversion):不把用户需要的功能直接提供出来,导致他们要用更上层的函数来重复实现 用意不明(Am

  • 问题内容: 我是一名Java开发人员,他 开始 掌握依赖注入的全部功能,突然间我意识到,没有办法注入静态方法。因此,我想到了: 静态方法是DI反模式吗? 更重要的是:如果我要接受依赖注入,这是否意味着我需要停止对静态方法进行编码?我问,因为没有办法在单元测试期间模拟它们并注入模拟静态变量,这对我来说是个很大的选择。 编辑 :我知道一种“包装”和注入现有的静态方法的通用方法是这样的: …但是我没有问

  • 问题内容: 我对故障排除看起来像是非常痛苦的故障排除经验,如下所示: 该问题很难解决,因为doSomeStuff()引发了异常,这又导致doSomeOtherStuff()也引发了异常。第二个异常(由finally块引发)抛出了我的代码,但是它没有第一个异常(由doSomeStuff()引发)的句柄,这是问题的真正根源。 如果代码改为这样说,那么问题就很明显了: 所以,我的问题是这样的: 在没有任