首页 > 解决方案 > 将带有延迟的异步 for 循环更改为同步 javascript

问题描述

我有一个异步代码循环内部函数有这样的延迟

    const timeout = ms => new Promise(res => setTimeout(res, ms))
    async function sayHai() {
      for (var i = 0; i < 100; i++) {
          await timeout(1000);
          console.log("Hai");
          if ( (i%5) == 4 ) await timeout(30000);
      }
    }
    
    sayHai();

我有该代码生成如下:

hai delay 1 sec
hai delay 1 sec
hai delay 1 sec
hai delay 1 sec
hai delay 1 sec
delay 30 sec
hai delay 1 sec
hai delay 1 sec
hai delay 1 sec
hai delay 1 sec
hai delay 1 sec

我希望代码是同步的,因为我想在控制台上使用它,所以我需要按顺序执行代码

标签: javascriptnode.jsasynchronousdelaysynchronous

解决方案


您正在尝试做的事情很复杂。它可以通过一个简单的队列来简化。有一个调用自身并为下一次迭代使用超时的函数。

function run() {
  let cnt = 0;
  function next() {
    cnt++;
    console.log(new Date().toLocaleString())
    window.setTimeout(next, cnt % 5 == 0 ? 5000 : 1000);
  }
  next();
}

run();


推荐阅读