Angularjs $q.defer()创建已解决的承诺
在一个让我掉头发的问题上寻求帮助!:) 我必须向我使用的API发送一系列调用。因此,我创建了一个工厂,其功能如下Angularjs $q.defer()创建已解决的承诺,angularjs,angular-promise,deferred,Angularjs,Angular Promise,Deferred,在一个让我掉头发的问题上寻求帮助!:) 我必须向我使用的API发送一系列调用。因此,我创建了一个工厂,其功能如下 addItem : function(){ var deferred=$q.defer(); //call to the API .then(function(response){ deferred.resolve(process(response.data)); }, function(response){ deferred.reje
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(..)
for(var i=0;i也许我不能解决您的问题,只是给出建议:
通过返回API调用的承诺,而不是创建新的承诺,可以节省大量代码(这是承诺反模式之一)
我更习惯于使用push分配到数组中
var arrayOfPromises = [];
for(var i=0; i<nbOfElements; i++) {
arrayOfPromises.push(Factory.addItem());
}
$q.all(arrayOfPromises).then(..)
var arrayOfPromises=[];
对于(var i=0;i只需返回$http.get()
承诺即可实际工作:
如果您想在返回数据之前在工厂进行一些预处理(如过程
和错误管理
),请检查演示:
$q.all
回调函数只有在解析所有承诺后才会调用。这不是因为$q.all
您的数组代码有问题:arrayOfPromises[i]=Factory.addItem();
。您最好使用push
扩展数组。什么是处理(response.data)
和错误管理(response.status)
do?请您也为他们提供代码。如果您只看到部分结果,那么您必须怀疑至少有一个arrayOfPromises
被拒绝,即发生了错误。若要查看发生了什么,请尝试在errorManagement()和/或链接的中记录错误。然后()
在$a.all(…)
之后。事实上,我在控制台中进行了检查,看起来所有承诺都已解决($$state==1)在解析之前…奇怪…绝对奇怪!您链接到的参考说明您需要检查promise.$$state.status
而不是promise.$$state
。是的,这是一个错误,我的意思是$$state.status,我将使用错误处理程序仔细编辑我对此的评论。您可能希望返回$q.reject(错误管理(response.status))
(假设errorManagement()
本身不返回被拒绝的承诺)@Phil根据我的经验,过程和错误管理不一定都是承诺-它们可以是正常的功能。是的,但OP似乎仍然希望在HTTP错误的情况下返回被拒绝的承诺。如果不使用$q.reject
,addItem
将始终返回成功的承诺,即使出现错误。@Phil谢谢,我一直误解了返回在then的第二个函数中是如何工作的。编辑了正确的答案。今晚我将尝试这种方式,非常感谢。如果它有效,我将接受你的答案!再次感谢你的帮助。谢谢你的回答,我正在看第二把小提琴,它完全按照我想要的方式工作,但我很难确定y原因!我将深入了解这一点。再次感谢您的帮助哦,我刚刚理解了我做错了什么,一些愚蠢的错误!在我的实际代码中,我是在另一个then()中创建数组的而$q.all当时不在a的范围内,因此不是异步的,因此在执行时基于一个空数组进行评估…这显然已经解决了:无论如何,再次感谢您的帮助,我将选择您的答案,因为它仍然是发现$q.all()的人的一个很好的用例函数!第二把小提琴落入承诺反模式之一,被遗忘的承诺。这并不是说它不起作用,只是有许多冗余代码,而且有一种更干净的方法。
var arrayOfPromises = [];
for(var i=0; i<nbOfElements; i++) {
arrayOfPromises.push(Factory.addItem());
}
$q.all(arrayOfPromises).then(..)