我有一个有点复杂的场景,我不太明白为什么我对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];
});
promise.all()
返回使用包含该数组的数组实现的promise 每个承诺的履行价值,或被拒绝的承诺 拒绝理由是第一个被拒绝的承诺。
在这种情况下,response
的值最终是单个Promise而不是promise值数组。这是Chrome Dev Tools在暂停调试器并记录response
值时所产生的内容:
Promise {}
inspect:()
promiseDispatch:(resolve, op, operands)
valueOf:()
我还在摸索的另一件事是,.then
在网络请求仍处于未决状态时被点击,这意味着传递给Q.all
的数组中的承诺也应该待定...
答案 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];
});