javascript - 执行一系列 Javascript promise ,一个接一个解决

标签 javascript asynchronous promise bluebird reduce

我想知道是否有一种方法可以瀑布式地执行一系列 promise ?即我希望在当前 promise 得到解决之前,下一个 promise 不会开始。

我的测试:

import Promise from 'bluebird'

describe('promises waterfall', () => {
  const result = []
  function doItLater(val, time = 50) => {
    return new Promise(resolve => {
      setTimeout(() => {
        result.push(val)
        resolve(val)
      }, time)
    })
  }

  it('execute promises one after one resolved', done => {
    result.push(1)
    const promiseList = [doItLater('a', 100),doItLater('b', 1),doItLater('c')]
    result.push(2)

    Promise.each(
      promiseList,
      (output) => {
        result.push(output + '-outputted')
      }
    )
      .then(
        () => {
          result.push(3)
          console.log(result)
          expect(result).to.eql([ 1, 2, 'a', 'b', 'c', 'a-outputted', 'b-outputted', 'c-outputted', 3 ])
          done()
        }
      )
  })
})

更新

抱歉,如果我让事情变得太困惑了。我想问一下我怎样才能通过测试。目前我的测试失败 - 实际结果顺序错误:

[ 1,
  2,
  'b',
  'c',
  'a',
  'a-outputted',
  'b-outputted',
  'c-outputted',
  3 ]

最佳答案

当你创建这样的 promise 时

[doItLater('a', 100),doItLater('b', 1),doItLater('c')]

它们已经在异步执行。无法控制它们的执行顺序。

您可以使用Promise.reduce对于你的情况,像这样

Promise.reduce([['a', 100], ['b', 1], ['c']], function(res, args) {
    return doItLater.apply(null, args).then(function(output) {
        res.push(output + '-outputted');
        return res;
    });
}, result)
.then(function(accumulatedResult) {
    ....
});

现在,我们正在一个接一个地创建 Promise,在前一个 Promise 得到解决之后,我们将结果累积在 res 中(实际上是 result)。当所有 promise 都得到解决时,accumulatedResult 将拥有所有值。


注意:强烈建议不要在函数之间共享数据。如果必须这样做,请确保您有令人信服的理由这样做。

关于javascript - 执行一系列 Javascript promise ,一个接一个解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36864780/

相关文章:

javascript - 使用键 :value pair? 填充选择框

javascript - 通过延迟图像来加快页面加载速度

javascript - 如何模拟输入禁用?

javascript - 如何禁用最大化、最小化和关闭按钮以打开新窗口

asynchronous - 使用 Spring @Async 时跟踪多个异步请求的状态

node.js - Node Jsreport 语法错误 : Identifier 'err' has already been declared

ios - 从 PromiseKit/Alamofire 返回一个 Promise

javascript - 与普通的 for 循环相比,Array 的 forEach 是异步的

Javascript:如何实现异步函数队列(无需库)

javascript - Promise.all 里面的 Promise.all 对于 Promise 来说是一个很好的实践吗?