首页 > 解决方案 > setImmediate 或 IO 回调会先运行吗?

问题描述

在这个图中,事件循环将运行 I/O 回调(axios 请求),然后是检查阶段(setImmediate),但是当我测试这个时,情况正好相反,我需要解释该代码的执行.

图表 在此处输入图像描述

标签: javascriptnode.jscallstackevent-loop

解决方案


console.log('first'); // logs instantly 

setImmediate(() => console.log('immediate')); // will be executed in the next iteration of the event loop.

new Promise((resolve) => { // starts in promise in pending state
  console.log('insidePromise');
  const data = 'Promise';
  resolve(data);
}).then((d) => console.log(d)); // prints after Promise is resolved

输出 -

first
insidePromise
Promise
immediate

当 Promise 被调用时,它开始处于挂起状态并等待解决。

setImmediate - 在处理解​​析之前在此处触发,因为setImmediate必须在事件循环中执行。

https://nodejs.dev/learn/understanding-javascript-promises

一旦一个 Promise 被调用,它将以挂起状态开始。这意味着调用函数会继续执行,而 Promise 在它解决之前一直处于挂起状态,向调用函数提供所请求的任何数据。

https://nodejs.dev/learn/understanding-setimmediate

任何作为 setImmediate() 参数传递的函数都是在事件循环的下一次迭代中执行的回调。


推荐阅读