我想等到回调完成。我试过类似的东西:
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')
})()
关于javascript - 等待回调执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50908448/