Angularjs $q.defer()创建已解决的承诺

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

在一个让我掉头发的问题上寻求帮助!:)

我必须向我使用的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(..)

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(..)