angularjs - 这是 "Deferred Antipattern"吗?

标签 angularjs angularjs-directive angularjs-service angular-promise

我发现很难理解“延迟反模式”。我想我原则上理解它,但我还没有看到一个 super 简单的例子来说明什么是服务,具有不同的 promise 和反模式,所以我想我会尝试制作自己的服务,但看到我不是这样 super 了解它,我会先得到一些澄清。

我在工厂(SomeFactory)中有以下内容:

//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;
    }

我检查其对象的原因只是为了在 $http.get() 上添加一个简单的验证层

下面,在我的指令中:

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

现在据我了解,这是一种反模式。因为最初的延迟 promise 捕获了错误并简单地吞掉了它。它不会返回错误,因此当调用此“getData”方法时,我必须执行另一个 catch 来捕获错误。

如果这不是反模式,那么有人可以解释为什么两者都需要某种“回调”吗?当我第一次开始编写这个工厂/指令时,我预计必须在某处执行延迟 promise ,但我没有预料到双方都必须 .catch() (也就是说,我有点认为我可以如果我执行了 SomeFactory.getData()

,则让工厂返回响应或错误

最佳答案

Is this a “Deferred Antipattern”?

是的,确实如此。 当创建一个新的冗余延迟对象并从 promise 链内部解析时,就会发生“延迟反模式”。在您的情况下,您使用 $q 来返回隐式返回 promise 的 promise 。你已经有一个 Promise 对象($http service 本身返回一个 promise),所以你只需要返回它即可!

这是一个 super 简单的示例,展示了具有延迟 promise 和反模式的服务的外观,

This is anti-pattern

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
});

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

希望有帮助:)

关于angularjs - 这是 "Deferred Antipattern"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30750207/

相关文章:

angularjs - AngularJS 服务提供的静态数据

AngularJS - 如何公开服务属性

javascript - Angularjs 和 jQuery 移动 slider 指令

javascript - AngularJS无法读取未定义的属性 '$setPristine'

angularjs - 在 Controller 之间共享模型

Angularjs自定义指令使用指令 Controller 变量

javascript - AngularJS fadein 适用于第一个元素

java - 如何在 Spring MVC 应用程序中运行 Angular 2 页面?

javascript - 名称为 'PokemonCtrl' 的 Controller 未注册

javascript - array.splice 在 Angular Js 指令中显示奇怪的行为