我想知道是否有一种方法可以瀑布式地执行一系列 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/