angularjs服务的错误行为?

时间:2014-05-03 13:16:42

标签: angularjs promise

我写了一个这样的服务:

pinholeAdminServices.factory('ServiceChannel', ['Channel', '$httpWrapper' , '$route', '$q' , function (Channel, $httpWrapper, $route, $q) {
    'use strict';
    return {
        'MultiChannelsLoader': function (params) {
            params = params || $route.current.params;
            var delay = $q.defer();
            Channel.query(params, function (response) {
                delay.resolve(response);
            }, function (error) {
                delay.reject(error);
            });
            return delay.promise;
        }
    }
}]);

之后我将var delay = $q.defer();的位置更改为服务顶部:

Services.factory('ServiceChannel', ['Channel', '$httpWrapper' , '$route', '$q' , function (Channel, $httpWrapper, $route, $q) {
    'use strict';
   var delay = $q.defer();
    return {
        'MultiChannelsLoader': function (params) {
            params = params || $route.current.params;
            Channel.query(params, function (response) {
                delay.resolve(response);
            }, function (error) {
                delay.reject(error);
            });
            return delay.promise;
        }
    }
}]);

并且应用程序行为完全错误。任何人都可以解释两部分代码之间的区别

1 个答案:

答案 0 :(得分:3)

这会为每个 ServiceChannel用法创建一个

这意味着,当您致电MultiChannelsLoader时,每次都会使用相同的承诺。

承诺是对一次计算的抽象。解决后,承诺无法改变其状态。

var d = $q.defer();
d.resolve("Foo"); // d will forever be remained in fulfilled state, with "Foo" 

想象一下,解决方案实现为:

resolve: function(){
    if(pending){ // not resolved yet
        pending = undefined; // change state to not pending.
    }
}

哦等等,it actually is。承诺规范对此也非常清楚:

  

满足后,承诺:不得过渡到任何其他州。   被拒绝时,承诺:不得过渡到任何其他州。

reference