在一个让我失去头发的问题上寻求帮助! :)
我必须向我消耗的API发送一系列调用。所以我创建了一个像
这样的函数的工厂addItem : function(){
var deferred=$q.defer();
//call to the API
.then(function(response){
deferred.resolve(process(response.data));
}, function(response){
deferred.reject(errorManagement(response.status));
});
}
return deferred.promise;
}
然后我用代码构建了一个数组:
for(var i=0; i<nbOfElements; i++) {
arrayOfPromises[i]=Factory.addItem();
}
$q.all(arrayOfPromises).then(..)
我的期望是,只有在完成对API的所有调用后,$ q.all才会解析。 不幸的是,似乎情况并非如此,然后我显示了部分结果,不满意
经过一些调试后,工厂返回的承诺似乎都有$$ state.status = 1,这似乎是&#34;已解决&#34;状态,解释为什么$ q.all在我想要之前解决了。 (link to the values of $$state.status)
我仍然觉得这很奇怪,因为我经常使用这个$ q.defer(),但没有$ q.all并且它总是工作正常
关于这个问题的任何解释以及如何解决它都会受到欢迎:)
答案 0 :(得分:1)
也许我无法解决您的问题,只是提出建议:
您可以通过返回API调用的承诺来保存大量代码,而不是创建新的承诺(这是承诺反模式之一)
addItem: function() {
//call to the API
return $http(something).then(function(response){
return process(response.data);
// if you happen need to reject here, use $q.reject(reason/data);
}, function(response){
return $q.reject(errorManagement(response.status));
});
}
使用push
分配到数组更方便var arrayOfPromises = [];
for(var i=0; i<nbOfElements; i++) {
arrayOfPromises.push(Factory.addItem());
}
$q.all(arrayOfPromises).then(..)
您在实际代码的.then
函数中addItem
之前的部分没有丢失,是吗?
答案 1 :(得分:1)