簡體   English   中英

如何多次依次執行多個異步功能?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM