【问题标题】:State of Macrotask and Microtask queue during this calculation本次计算中 Macrotask 和 Microtask 队列的状态
【发布时间】:2019-06-05 16:48:18
【问题描述】:

这个问题的意图与Difference between microtask and macrotask within an event loop context 非常相似,但更具体的是,它要求解释一个明确的例子:我认为因此不应将其视为重复。

node.js中这段代码执行过程中Macrotask queue和Microtask queue的状态是什么

console.log("A1");

(async ()=> {

    console.log("1")

    f = async ()=>{console.log('2')}

    await f()

    console.log("3")

})()

console.log("A2");

输出:

A1
1
2
A2
3

我预期的输出: A1,A2,'1','2','3'

基于这个推理:log A1 --> 在微任务队列中加入匿名函数--> log A2 --> 执行匿名函数log 1,在微任务队列中加入f--> 从微任务队列中执行f-->日志 2 --> 日志 3

我哪里错了? (另外,顶级异步函数是如何入队的?)

注意:用于运行它的实际命令是 npx babel-node myscript.js

【问题讨论】:

  • 只是,没有理由,我正在使用 babel 做别的事情,碰巧在这里使用它
  • (对于潜伏者:Babel 输出也是最新的 Node.js 原生地使用此代码所做的。)

标签: javascript node.js async-await


【解决方案1】:

您看到此行为是因为 async 函数同步运行直到第一个 await、显式 return 或隐式 return(代码执行在函数)。

我将稍微更改代码,为外部 async 函数命名,这样更容易讨论:

console.log("A1");
const outer = async () => {
    console.log("1")
    f = async ()=>{console.log('2')}
    await f()
    console.log("3")
};
outer();
console.log("A2");

会发生什么:

  1. console.log("A1") 运行(当然)。
  2. outer() 被调用。
  3. outer 的同步部分运行,所以它:
    • 运行console.log("1")
    • 创建f
    • 致电f()
  4. f 的同步部分运行,所以它:
    • console.log('2')
  5. 此时,f 隐式返回,因此它将其承诺返回给outer。该承诺已通过值undefined 实现。 (请参阅规范中的 here。)
  6. outer 等待 f 的承诺,因此它将其承诺返回给调用者(将其丢弃,但这并不重要)。
  7. outer 等待 f 的承诺将微任务排队以继续 outer 因为 f 的承诺已经完成。
  8. console.log("A2") 运行。
  9. 微任务运行,允许outer 继续并执行console.log("3")

【讨论】:

  • 隐式等待或返回是什么意思,隐式等待是否意味着等待承诺解决?
  • @tjb - 抱歉,“(隐式或显式)”仅指return,我看看能否改写。当然,显式返回是return;return value;。隐式返回只是代码执行到达函数末尾,fouter 都这样做。
  • @tjb - 我已经更新以处理隐式或显式的事情并添加更多细节。
  • 谢谢,我想我开始明白了,...但我已经想了很多次了 :)
  • @tjb - 哈哈,去过!
猜你喜欢
  • 2021-12-09
  • 1970-01-01
  • 2016-06-18
  • 2018-07-20
  • 2021-05-17
  • 2020-11-23
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
相关资源
最近更新 更多