如何同步延迟Javascript中的代码执行?

How to synchronously delay code execution in Javascript?

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

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

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

Before Execution...
After Execution...
Between

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

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

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 回调中,但我不建议这样做。回调更难跟踪,并且经常导致意大利面条代码。

没有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();