如何连续多次执行多个异步函数?

d-_*_*_-b 1 javascript asynchronous

假设我有两个异步函数,A和B,它们彼此独立.

我想要做的是按顺序多次执行这些功能,如下所示

A -> B -> A -> B -> A -> ... 
Run Code Online (Sandbox Code Playgroud)

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();
   // ----
  }
}
Run Code Online (Sandbox Code Playgroud)

我该如何更改代码?

T.J*_*der 6

你是正确的方向,但你需要继续链接thens.您通常从预先解决的承诺开始,Promise.resolve()然后添加到链中使用then,保留每个新承诺:

let p = Promise.resolve();
for (var i=0; i<200; i++) {
  p = p.then(A).then(B);
}
p.then(() => {
  console.log("All done");
});
Run Code Online (Sandbox Code Playgroud)

实例(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");
});
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper {
  max-height: 100% !important;
}
Run Code Online (Sandbox Code Playgroud)

(在实际代码中,您.catch当然也可以处理拒绝;或者您将最后的承诺返回给其他可以处理它们的代码.)