【问题标题】:will the setImmediate or the IO callback run first?setImmediate 或 IO 回调会先运行吗?
【发布时间】:2021-06-24 08:10:24
【问题描述】:

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

【问题讨论】:

  • axios.get 只是花费了太多时间,并且在下一次迭代中完成。
  • 是不是说还没入队列,是不是说一旦得到http响应就会加入队列?
  • 只有在解决了 IO 时才记录 promise。我怀疑它会在immediate 之前成功。

标签: javascript node.js callstack event-loop


【解决方案1】:
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() 参数传递的任何函数都是在事件循环的下一次迭代中执行的回调。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2017-03-25
    • 2023-02-03
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多