等待直到执行回调

时间:2018-06-18 11:26:45

标签: 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");

唯一的输出是

waiting

它并没有进一步发展。甚至"等待=假" 2秒后不打印。有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

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。这给人的印象是,在继续前进之前等待承诺解决,逻辑是同步的。



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