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

$q.defer() creating a resolved promise

就让我脱发的问题寻求帮助! :)

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

我的预期是 $q.all 只有在对 API 的所有调用都已完成时才会解析。 不幸的是,好像不是这样,然后我显示了部分结果,不满意

经过一番调试,似乎工厂返回的promise都有$$state.status = 1,好像是"resolved"状态,解释了为什么$q.all解决之前我想。 (link to the values of $$state.status)

我仍然觉得这很奇怪,因为我经常使用这个 $q.defer(),但没有 $q.all 它总是工作正常

非常欢迎任何关于这个问题的解释以及如何解决:)

可能我解决不了你的问题,给点建议:

您可以通过返回 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(..)

你的真实代码中 addItem 函数中没有遗漏 .then 之前的部分,是吗?

只需 return $http.get() 承诺将实际起作用:JSFiddle.

如果您想在 return 输入数据之前在工厂中进行一些预处理(例如您的 processerrorManagement),请查看演示:JSFiddle .

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

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