等待回调执行

Waiting until a callback is executed

我想等到回调完成。我试过类似的东西:

let wait = true;
setTimeout(() => {
    console.log("wait = false");
    wait = false;
}, 2000);
console.log("waiting");
while(true) {
    if(!wait) break;
}
console.log("finished waiting");

唯一的输出是

waiting

并且它没有进一步进行。即使 "wait = false" 也不会在 2 秒后打印出来。有人可以解释为什么会这样吗?

你的 while 循环永远不会让 setTimeout 运行。这是一个 同步 无限循环逻辑,将阻塞 js 线程直到永远。

setTimeout 是一个异步方法并在事件队列中注册自己。当主堆栈完成其工作时,事件循环检查队列中是否有待处理的工作并将其带回主线程。

在你的情况下,主堆栈永远不会空闲,因为 while 循环永远不会完成。

您可以使用 Promise 来做到这一点。

var promise = new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('timeout executed after 2s');
      resolve(); // resolve when setTimeout is done.
    }, 2000);
});
console.log('waiting');
promise.then(_ => console.log("finished waiting")); // Use `.then` to do work after promise is resolved.

或者您可以在 setTimeout

的回调中执行此操作

var callback = function() { 
  console.log('finished execution');
  // all other work.
}

console.log('waiting');
setTimeout(callback, 2000);

或使用async-await。这给人的印象是逻辑是同步的,在继续之前等待 promise 解决。

(async function() {
  console.log('waiting')
  await new Promise((resolve, reject) => {
    setTimeout(_ => {
      console.log('setTimeout executed');
      resolve();
    }, 2000)
  })
  console.log('finished execution')
})()