Q.all()不返回已解析值的数组

时间:2016-08-03 22:26:28

标签: javascript promise q

我有一个有点复杂的场景,我不太明白为什么我对Q.all的调用没有返回一系列已解决的承诺。它是jQuery $.ajax调用和Q.调用的混合。这是设置:

var saveThing1 = function(){
  return $.ajax({...});
}
var saveThing2 = function(){
  return $ajax({...});
}
var deleteThing2 = function(){
  return $.ajax({...});
}

saveThing1.then(function(){
  var promiseArr = [saveThing2(), saveThing2(), deleteThing2()];
  return Q.all(promiseArr);
}).then(function(response){
  var result1 = response[0];
  var result2 = response[1];
  var result3 = response[2];
});

From the Q docs

  

promise.all()

     

返回使用包含该数组的数组实现的promise   每个承诺的履行价值,或被拒绝的承诺   拒绝理由是第一个被拒绝的承诺。

在这种情况下,response的值最终是单个Promise而不是promise值数组。这是Chrome Dev Tools在暂停调试器并记录response值时所产生的内容:

Promise {}
  inspect:()
  promiseDispatch:(resolve, op, operands)
  valueOf:()

我还在摸索的另一件事是,.then在网络请求仍处于未决状态时被点击,这意味着传递给Q.all的数组中的承诺也应该待定...

1 个答案:

答案 0 :(得分:2)

.all不会对函数执行任何操作,它需要Promise(或类似Promise的对象)。您目前正在传递函数,而不是承诺。为了使其工作,需要调用所有函数:

var saveThing1 = function(){
  return $.ajax({...});
}
var saveThing2 = function(){
  return $ajax({...});
}
var deleteThing2 = function(){
  return $.ajax({...});
}

saveThing1().then(function(){
  // populate the array with returned promises, not functions that return promises
  var promiseArr = [saveThing2(), saveThing2(), deleteThing2()];
  return Q.all(promiseArr);
}).then(function(response){
  var result1 = response[0];
  var result2 = response[1];
  var result3 = response[2];
});