【发布时间】:2016-08-04 06:37:13
【问题描述】:
我有一个有点复杂的场景,我不太明白为什么我对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 开发工具在我暂停调试器并记录 response 值时产生的结果:
Promise {}
inspect:()
promiseDispatch:(resolve, op, operands)
valueOf:()
我还在摸不着头脑的另一件事是.then 在网络请求仍处于挂起状态时被命中,这意味着传递给Q.all 的数组中的承诺也应该处于挂起状态...
【问题讨论】:
-
你需要调用你的函数(例如
saveThing1().then)才能返回一个promise -
saveThing1.then()应该是saveThing1().then()。 -
jQuery ajax Promise 是一头古怪的野兽。他们自己不会解决一个单一的值(这完全是非标准的),这有时会真的把事情搞砸。
-
jfriend 说的。使用
Q(saveThing1()).then(…) -
谢谢大家。我想我不会相信 jQuery 2.x 的承诺!
标签: javascript promise q