javascript - 在 promise 链中容纳 Q.all

标签 javascript node.js promise q

我对 Q 的简单性发誓,所以我可能没有做太多研究来检查其他“当时”的实现。但我经常使用 Q!

我有一个“then” promise 链,我想在其中解决一个“batch” promise ,然后按顺序进行其他操作;所以很明显我应该使用 Q.all。但是我被困在这里了。要么是 Q 做错了,要么是我做错了。

这里有两个假设的异步操作

var f=function(delay){
  return Q.delay(delay).then(function(){
    console.log("returning delayed",delay)
    return delay
  })
}

f2=function(delay){
  var defer=Q.defer()
  setTimeout(function(){
    console.log("returning timedout",delay)
    return delay
  },delay)
  return defer.promise
}

这是 promise 链

  Q('begin')
    .then(console.log)
    .then(Q.all([100,200,300,400].map(f)))
    .then(function(){
      console.log("Finally",arguments)
    }).done()

这是我想要的输出

begin
returning delayed 100
returning delayed 200
returning delayed 300
returning delayed 400
Finally { '0': undefined }

但这是我得到的输出

begin
Finally { '0': undefined }
returning delayed 100
returning delayed 200
returning delayed 300
returning delayed 400

我得到与 f2 相同的序列

现在,如果我运行这个

Q.all([100,200,300,400].map(f)).then(function(){
  console.log("Finally",arguments)
}).done()

我明白了

returning delayed 100
returning delayed 200
returning delayed 300
returning delayed 400
Finally { '0': [ 100, 200, 300, 400 ] }

但是使用 f2 而不是 f 给我

returning timedout 100
returning timedout 200
returning timedout 300
returning timedout 400

它不执行 finally block 。

我得到与 Q.[all/allResolved/allSettled] 相同的输出

所以,我的问题是,

  1. 如何通过专门使用 Q.all 实现预期的输出。虽然我确实有一个解决方法,但它看起来不太好。
  2. ff2 有何不同,因为使用它们运行 Q.all().then() 的结果不同。

最佳答案

Q.all 接受一个 promise 数组,但随后返回一个 promise (这是数组中的每个 promise 都被解析时唯一被解析的。

所以,我认为您需要返回 Q.all 的结果,以免立即调用下一个 then:

Q('begin')
    .then(console.log)
    .then(function() {
        return Q.all([100,200,300,400].map(f));
    })
    .then(function(){
      console.log("Finally",arguments)
    }).done()

关于javascript - 在 promise 链中容纳 Q.all,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28045319/

相关文章:

node.js - promise - 捕获内投

angularjs - 使用 Promise 从 Angularjs 中的 JSON 文件读取数据

javascript - elm-webgl 中的模板缓冲

javascript - 将任意数量的参数传递给 Javascript 函数

javascript - 使用正则表达式查找字符串中的所有子字符串javascript

node.js - 将 `pipeline` 中的 `node:stream/promise` 用于多个可写源

Javascript 和 CSS 代码字面上出现在我的 HTML 页面上

node.js - 发送以太坊交易,Web3.js没有源地址,但有源私钥?

node.js - iisnode-IIS7.5 : 405 Method not allowed when performing PUT request

node.js - MongoDB 找不到 Promise 类型定义