等待回调执行

ibo*_*odi 4 javascript callback wait

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

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

唯一的输出是

waiting
Run Code Online (Sandbox Code Playgroud)

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

kid*_*ils 5

你的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.
Run Code Online (Sandbox Code Playgroud)

或者你可以在回调中做到这一点 setTimeout

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

console.log('waiting');
setTimeout(callback, 2000);
Run Code Online (Sandbox Code Playgroud)

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

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