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 秒后打印。有人可以解释为什么会这样吗?
你的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)
归档时间: |
|
查看次数: |
7166 次 |
最近记录: |