多个诺言的障碍/等待多个setTimeout调用

问题描述 投票:-1回答:1

在想-同步多个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)
javascript node.js promise settimeout
1个回答
3
投票

似乎您在这里所需的全部都是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()的数组实际上没有任何可操作的保证。

© www.soinside.com 2019 - 2024. All rights reserved.