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)
我该如何更改代码?
你是正确的方向,但你需要继续链接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当然也可以处理拒绝;或者您将最后的承诺返回给其他可以处理它们的代码.)