[英]How to execute multiple asynchronous functions sequentially multiple times?
假設我有兩個異步函數A和B,它們彼此獨立。
我想要做的是多次執行這些功能,如下所示
A -> B -> A -> B -> A -> ...
B等待直到A完成,反之亦然。
以下是我到目前為止所做的事情,我知道它不會按照我想要的方式工作。
function A() {
var promise = new Promise...
...
return promise;
}
function B() {
var promise = new Promise...
...
return promise;
}
for(var i=0; i<200; i++) {
var p1 = A();
p1.then(() => {
var p2 = B();
// ----
}
}
我應該如何更改代碼?
您的方法正確,但是您需要繼續鏈接then
。 通常,您從Promise.resolve()
的預先解析的Promise.resolve()
開始,然后使用then
來添加到鏈中,並保留每個新Promise.resolve()
:
let p = Promise.resolve();
for (var i=0; i<200; i++) {
p = p.then(A).then(B);
}
p.then(() => {
console.log("All done");
});
實時示例(用20代替200):
let counterA = 0; let counterB = 0; function A() { var promise = new Promise(resolve => { setTimeout(() => { ++counterA; console.log("A done (" + counterA + ")"); resolve(); }, 100); }); return promise; } function B() { var promise = new Promise(resolve => { setTimeout(() => { ++counterB; console.log("B done (" + counterB + ")"); resolve(); }, 100); }); return promise; } let p = Promise.resolve(); for (var i=0; i<20; i++) { p = p.then(A).then(B); } p.then(() => { console.log("All done"); });
.as-console-wrapper { max-height: 100% !important; }
(當然,在實際代碼中,您還需要具有.catch
來處理拒絕;否則,您將把最后的承諾返回給其他可以處理拒絕的代碼。)
您可以使用chained .then()
將調用chained .then()
以確保在完成前面的調用之后調用它們。
let cA = cB = 0; function A() { return new Promise(resolve => { setTimeout(() => { resolve("A " + ++cA); console.log("A done"); }, 200); }); } function B() { return new Promise(resolve => { setTimeout(() => { resolve("B " + ++cB); console.log("B done"); }, 300); }); } function callConsecutive(times) { if (times == 0) return Promise.resolve([]); times--; const a = A(), b = a.then(B), c = b.then(() => { return callConsecutive(times) }); return Promise.all([a, b, c]).then(([r1,r2,r3]) => Promise.resolve([r1,r2,...r3])); } callConsecutive(5).then(results => { console.log(results); })
您可以使用遞歸函數
function seqAB(count) {
if(!count) Promise.resolve();
var p1 = A();
p1.then(() => {
var p2 = B();
p2.then(() => {
seqAB(count - 1);
})
})
}
seqAB(200);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.