完成setTimout()代码后同步执行代码的简单方法

时间:2018-06-19 00:00:00

标签: javascript settimeout synchronous

我需要一种简单的方法来等待setTimeout代码完成执行,然后运行setTimeout之后的代码。 现在,在loop / setTimout执行完毕之前,包含setTimout的循环代码正在执行。

for(let i = 0; i < 5; i++) {
   setTimeout(function(){
    console.log(i);
  }, i*1000);
 }
console.log("loop/timeout is done executing");

2 个答案:

答案 0 :(得分:4)

根据定义,

setTimeout不是同步的 - 无论你用什么来解决问题, 都是异步的,没有办法解决这个问题。

实现此类目标的最佳方法是使用Promise代替,在创建的承诺数组上调用Promise.all

(async () => {
  await Promise.all(Array.from(
    { length: 5 },
    (_, i) => new Promise(res => setTimeout(() => {
      console.log(i);
      res();
    }, i * 1000))
  ));
  console.log("loop/timeout is done executing");
})();

虽然await正在等待Promise,但Promise不是同步的,如果您希望代码看起来是平的,那么您可以使用console.log与主要功能块相同的缩进级别,这可能是要走的路。

答案 1 :(得分:2)

你可以定义一个函数并在超时内调用该函数

    let currentForId = 0;
    for(let i = 0; i < 5; i++) {
       setTimeout(function(){
        console.log(i);
        if(++currentForId == 5)
        calling("message");
      }, i*1000);
     }


    function calling(msg){
       console.log(msg);
       console.log("loop/timeout is done executing");
    }