[英]Execute an array of Javascript promises one after one resolved
我想知道是否有辦法可以瀑布式地執行一系列承諾? 即我希望下一個承諾在當前的承諾得到解決之前不要開始。
我的測試:
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 ]
當你創建這樣的承諾時
[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) {
....
});
現在,我們正在一個一個地創建承諾,在解決前一個承諾之后,我們將結果累加到res
(實際上是result
)。 當所有承諾都被解決時, accumulatedResult
將擁有所有值。
注意:強烈建議不要在函數之間共享數據。 如果必須這樣做,請確保您有令人信服的理由這樣做。
// Promisse waterfall pattern
var promises = [1,2,3].map((guid)=>{
return (param)=> {
console.log("param", param);
var id = guid;
return new Promise(resolve => {
// resolve in a random amount of time
setTimeout(function () {
resolve(id);
}, (Math.random() * 1.5 | 0) * 1000);
});
}
}).reduce(function (acc, curr, index) {
return acc.then(function (res) {
return curr(res[index-1]).then(function (result) {
console.log("result", result);
res.push(result);
return res;
});
});
}, Promise.resolve([]));
promises.then(console.log);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.