在想-同步多个setTimeout调用的方式是什么。基本上,此代码应打印A,B和C(顺序无关紧要),但重要的是应最后打印完成。
function printAsync(s) {
return new Promise( function(resolve){
setTimeout(function() {
console.log(s);
resolve();
}, Math.floor((Math.random()*1000)+500));
})
}
function inparallel(parallel_functions, final_function) {
let p = Promise.resolve()
.then(() => {
const promises = [];
for( i = 0 ; i < parallel_functions.length ; i++) {
promises.push(parallel_functions[i]());
}
return Promise.all(promises);
}).then(() => {
final_function();
});
}
A=function(){printAsync("A");}
B=function(){printAsync("B");}
C=function(){printAsync("C");}
D=function(){printAsync("Done");}
inparallel([A,B,C],D)
似乎您在这里所需的全部都是Promise.all()
,然后您需要从函数中返回承诺,以便可以使用这些承诺来协调事物。
以下是一个可运行的代码段,以进行说明。
在多次运行中,您会看到“ A”,“ B”和“ C”之间的相对顺序不同(由于使用了随机计时器,但是“完成”将始终排在最后。)>
function printAsync(s) {
return new Promise( function(resolve){
setTimeout(function() {
console.log(s);
resolve();
}, Math.floor((Math.random()*1000)+500));
})
}
const A = function(){return printAsync("A");}
const B = function(){return printAsync("B");}
const C = function(){return printAsync("C");}
const D = function(){return printAsync("Done");}
Promise.all([A(), B(), C()]).then(D);
FYI,在您的inparallel()
实现中没有看到您不能使用Promise.all()
的任何内容,但是您的inparallel()
无法完成它的工作,因为您的函数没有返回它们创建的承诺。当您这样做时:
promises.push(parallel_functions[i]());
调用
parallel_functions[i]()
没有返回值,因此传递给Promise.all()
的数组实际上没有任何可操作的保证。