我想等到回调结束。我试过像:
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秒后不打印。有人可以解释为什么会这样吗?
答案 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')
})()