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

Nad*_*rsi 2 javascript synchronous settimeout

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

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

Cer*_*nce 5

setTimeout顾名思义,不是同步的——无论你用什么来解决问题,都必须是异步的,没有办法解决这个问题。

实现这样的事情的最好方法是使用Promises 代替,调用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");
})();
Run Code Online (Sandbox Code Playgroud)

尽管await正在等待 Promise,并且 Promise 不是同步的,但如果您希望代码看起来平坦,以便您可以将 finalconsole.log置于与主功能块相同的缩进级别,这可能是要走的路。