带有promise和async / await的调用栈是什么样的?

时间:2019-11-29 13:35:02

标签: javascript node.js callstack event-loop

我最近观看了以下视频:https://www.youtube.com/watch?v=8aGhZQkoFbQ,并且正在尝试为Promises寻找类似的解释。特别是在节点中。

我可能是错的,但我的印象是Promises放在微任务队列上,仅在调用堆栈为空时处理微任务队列,一旦事件循环开始处理微任务队列,它将对其进行处理直到队列为空。

const sleep = (ms) => new Promise((res) => {
  setTimeout(res, ms)
});

const doTask1 = (workerId) => sleep(1000).then(() => console.log(`[${workerId}] Completed Task 1`));
const doTask2 = (workerId) => sleep(5000).then(() => console.log(`[${workerId}] Completed Task 2`));

const worker = async (workerId) => {
  console.log(`[${workerId}] Starting work`)
  await doTask1(workerId);
  await doTask2(workerId);
  console.log(`[${workerId}] Completed all tasks`);
};

worker('A');
worker('B');

运行上面的代码段后,工作人员A和B将在大约同一时间启动任务1和2,并在大约同一时间完成。我在将这种行为与我已阅读/看到的有关Promises /微任务和事件循环的内容合并时遇到困难。

我想象当代码执行时,调用堆栈如下:

  1. Callstack:[main.js]
  2. Callstack:[main.js] [worker('A')]
  3. Callstack:[main.js] [worker('A')] [console.log()]
  4. Callstack:[main.js] [worker('A')] [await doTask1()]

当我们使用await时,调用栈会发生什么?我想这与发电机的工作方式有关?

  1. 呼叫栈:??? |微任务队列:[doTask1()]

事件循环“处理”微任务队列是什么意思?处理doTask1()是否表示事件循环正在等待1秒?听起来不对。如YouTube视频对WebAPI的描述所示,是否在不同的线程上进行了1秒等待(是否正确?)?超时完成后,Promise的res进入消息队列,事件循环最终在该消息队列中接听并解决Promise?要执行res,调用栈是否必须为空?

我现在仍处于困境,不确定在调用堆栈中接下来发生什么,消息队列,微任务队列以及事件循环如何决定下一步做什么。

0 个答案:

没有答案