javascript - 等待回调执行

标签 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

它不会继续进行下去。即使是“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/

相关文章:

javascript - Ajax 上传不工作 codeigniter

javascript - 如何使用 Meteor.startup 修复文件加载顺序问题?

javascript - jquery 完整日历 : callback 'after' the calendar has loaded completely

java - java中指向函数的指针

javascript - 在 Ruby on Rails 的 View 中加载 JavaScript

javascript - VueJS 仅 JS 转换 Hook 需要 setTimeout 才能使 CSS 转换正常工作

javascript - 用于删除方法的 Rails 自定义 Twitter Bootstrap 模式,回调问题

multithreading - 为什么 std::condition_variable::wait 需要互斥锁?

c++ - C++ 中的点云库 (PCL) 等待/延迟/ sleep 函数

javascript - 如何让javascript等到它从同步http请求中得到有效响应?