【问题标题】:How to synchronously delay code execution in Javascript? [duplicate]如何在Javascript中同步延迟代码执行? [复制]
【发布时间】:2025-12-26 13:55:05
【问题描述】:

我有一个程序,它应该执行第一行并等待两秒钟,然后执行第二行,最后执行第三行。

console.log("Before Execution...");
setTimeout(() => console.log("Between"), 2000);
console.log("After Execution...");

但是我得到的输出是这样的:

Before Execution...
After Execution...
Between

我知道这是因为setTimeout() 异步工作,但必须有办法进行真正的同步延迟。

【问题讨论】:

  • 您可以将第三个console.log 放在您的setTimeout 回调()=> {console.log("Between"); console.log("After execution");} 中,不建议使用同步延迟,因为它会阻塞UI 线程,因此您的页面将冻结且无响应
  • 如果您的实际代码更复杂,您可以使用 async/await 的基于 promise 的方法,如 georg 的回答所示

标签: javascript synchronous


【解决方案1】:

不,不可能进行同步延迟。你必须像这样使用 Promise:

const delay = n => new Promise(r => setTimeout(r, n));

async function main() {
    console.log("Before Execution...");
    await delay(1000);
    console.log("After Execution...");
}

main()

理论上,您可以将“之后”部分放入setTimeout 回调中,但我不建议这样做。回调更难遵循,并且经常导致意大利面条式代码。

【讨论】:

  • 好的,它工作正常。
【解决方案2】:

没有 setTimeout 总是异步的。但是我们可以定义自己的自定义超时函数并使其同步。

// Tell the browser that this function is asynchronous
async function myTimeoutFunc(delay) {
    // Await for the promise to resolve
    await new Promise((resolve) => {
        setTimeout(() => {
            // Resolve the promise
            resolve(console.log('Between'));
        }, delay);
    });
}

async function myMainFunc (){
  console.log("Before Execution...");
  await myTimeoutFunc(2000);
  console.log("After Execution...");
}

myMainFunc();

【讨论】:

  • 谢谢,但是我们没有返回承诺,为什么还要等待myTimeoutFunc(2000)
  • myMainFunc func 需要知道我们调用的函数是异步的还是同步的。这就是为什么我们需要使用 await。
  • 我已经执行了你的代码。当我们使用 await 时,它是否只等待 promise 执行?
  • 如果你用 promise 函数包装你的 func,它的工作同步或异步方式。如果要运行该函数并等待响应需要使用等待。如果您不关心该 func 响应,则不需要放置 await =
  • 好的,知道了。