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

Simple way to synchronously execute code after setTimout() code is done

我需要一种简单的方法来等待 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");

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

    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");
    }
    

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");
})();

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

计数结束时需要 运行 的 code/message 需要在 for 循环内。这是实现此目的的简单方法。

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