【问题标题】:Barrier for multiple promises / wait for multiple setTimeout calls多个承诺的障碍/等待多个 setTimeout 调用
【发布时间】:2019-11-22 20:29:04
【问题描述】:

想知道 - 同步多个 setTimeout 调用的方法是什么。基本上这段代码应该打印 A、B 和 C(顺序无关紧要),但重要的是 Done 应该最后打印。

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() 似乎就是您所需要的一切。

标签: javascript node.js promise settimeout


【解决方案1】:

您似乎只需要 Promise.all() 本身,然后您需要从您的函数中返回承诺,以便可以使用这些承诺来协调事情。

这里有一个可运行的 sn-p 来说明。

您会在多次运行中看到“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);

仅供参考,我在您的 inparallel() 实现中看不到任何您不能使用 Promise.all() 的内容,但是您的 inparallel() 无法完成这项工作,因为您的函数不会返回它们创建的承诺.当你这样做时:

promises.push(parallel_functions[i]());

调用parallel_functions[i]() 没有返回值,因此您传递给Promise.all() 的数组实际上没有任何可操作的承诺。

【讨论】:

  • 感谢您的回答,但我仍然很困惑 promises.push(parallel_functions[i]()) 和 [A(), B(), C()] 之间的区别 - 这两个数组由这些函数返回的值组成
  • @MichałDygas - 我注意到这是 5 个月前的情况。让我花点时间试着记住我们在讨论什么。当您将一个数组传递给Promise.all() 时,该数组应该是一个promise 数组。您最初的问题是promises.push(parallel_functions[i]);。那是一组函数,而不是一组承诺。然后,当您尝试执行实际调用函数的promises.push(parallel_functions[i]()); 时,但它们没有返回值,所以现在您正在传递undefined 值的数组。在您的示例中,您需要调用一个返回 PROMISE 的函数。
猜你喜欢
  • 2016-10-16
  • 2014-06-14
  • 2018-05-27
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多