我写了一个这样的服务:
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;
}
}
}]);
并且应用程序行为完全错误。任何人都可以解释两部分代码之间的区别
答案 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。承诺规范对此也非常清楚:
满足后,承诺:不得过渡到任何其他州。 被拒绝时,承诺:不得过渡到任何其他州。