[英]How to dynamically add new promise to the promises chain
我想創建promises鏈,然后根據需要動態添加盡可能多的promises。 這些添加可能在一些循環中具有動態步數,因此我不能使用鏈接,如.then()。then()。然后...代碼bellow工作不正常,但你會得到這個想法。 結果應該是一個控制台在3,4和5秒內記錄了3000,4000,5000個數字,但實際上並不是這樣。 有任何想法嗎?
let launchChain = function(delay)
{
return new Promise((resolve: Function, reject: Function) => {
setTimeout(() => {
console.log(delay);
resolve();
}, delay)
})
}
let chain = launchChain(3000);
chain.then(function () {
return launchChain(4000);
})
chain.then(function () {
return launchChain(5000);
})
function run(delay){
let chain = launchChain(delay);
chain.then(function() {
run(delay+1000);
});
}
run(3000);
var delays = [0, 1000, 2000, 3000, 4000]; function workMyCollection(arr) { return arr.reduce(function(promise, item) { return promise.then(function() { return launchChain(item); }); // uses this orignal promise to start the chaining. }, Promise.resolve()); } function launchChain(delay) { return new Promise(function(resolve, reject) { setTimeout(function() { console.log(delay); resolve(); }, delay); }); } workMyCollection(delays);
var delays = [0, 1000, 2000, 3000, 4000]; var currentPromise = Promise.resolve(); for (let i = 0; i < delays.length; i++) { // let makes i block scope .. var would not have done that currentPromise = currentPromise.then(function() { return launchChain(delays[i]); }); } function launchChain(delay) { return new Promise(function(resolve, reject) { setTimeout(function() { console.log(delay); resolve(); }, delay); }); }
如果這對你有用,請告訴我:)由於這個問題,我學到了很多東西!
謝謝sinhavartika! 有用! 但我實際上從這里舉了個例子https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce並稍微改了一下,現在我在下面的項目中使用它方式:
/**
* Runs promises from promise array in chained manner
*
* @param {array} arr - promise arr
* @return {Object} promise object
*/
function runPromiseInSequense(arr) {
return arr.reduce((promiseChain, currentPromise) => {
return promiseChain.then((chainedResult) => {
return currentPromise(chainedResult)
.then((res) => res)
})
}, Promise.resolve());
}
var promiseArr = [];
function addToChain(delay)
{
promiseArr.push(function (delay) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(delay);
resolve();
}, delay)
});
}.bind(this, delay))
}
addToChain(1000);
addToChain(2000);
addToChain(3000);
addToChain(4000);
runPromiseInSequense(promiseArr);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.