$ q.defer()创建一个已解决的promise

时间:2015-09-01 03:25:23

标签: 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.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并且它总是工作正常

关于这个问题的任何解释以及如何解决它都会受到欢迎:)

2 个答案:

答案 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)

只需返回$http.get()承诺即可实际运作:JSFiddle

如果您想在返回数据之前在工厂进行一些预处理(例如processerrorManagement),请查看演示:JSFiddle

仅在解决了所有承诺后才调用$q.all回调函数。这不是因为$q.all

您的数组代码有问题:arrayOfPromises[i]=Factory.addItem();。您最好使用push扩展数组。