【问题标题】:Q.all() not returning array of resolved values [duplicate]Q.all()不返回解析值数组[重复]
【发布时间】: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];
});

From the Q docs

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


【解决方案1】:

.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];
});

【讨论】:

  • 对不起,他们在我的代码中被调用。我在这里(显然)对其进行了概括,并删除了一些臃肿/不相关的东西。我已经更新了示例代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 2021-12-25
  • 2014-09-25
  • 1970-01-01
  • 2021-06-13
相关资源
最近更新 更多