我最近观看了以下视频: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 /微任务和事件循环的内容合并时遇到困难。
我想象当代码执行时,调用堆栈如下:
当我们使用await
时,调用栈会发生什么?我想这与发电机的工作方式有关?
事件循环“处理”微任务队列是什么意思?处理 doTask1()
是否表示事件循环正在等待1秒?听起来不对。如YouTube视频对WebAPI的描述所示,是否在不同的线程上进行了1秒等待(是否正确?)?超时完成后,Promise的res
进入消息队列,事件循环最终在该消息队列中接听并解决Promise?要执行res
,调用栈是否必须为空?
我现在仍处于困境,不确定在调用堆栈中接下来发生什么,消息队列,微任务队列以及事件循环如何决定下一步做什么。