gpt4 book ai didi

javascript - 作业队列如何与 promise 一起工作?

转载 作者:行者123 更新时间:2023-12-03 07:25:20 25 4
gpt4 key购买 nike

我正在学习 JS 中的 Promise,并对 Promise 如何在幕后与 Job 队列一起工作感到好奇。为了解释我的困惑,我想向您展示这段代码:

new Promise(function(resolve, reject) {

setTimeout(() => resolve(1), 1000);

}).then(function(result) {

alert(result); // 1

return new Promise((resolve, reject) => { // (*)
setTimeout(() => resolve(result * 2), 1000);
});

})

如果你看上面的代码,then()的回调是不是预先放入Job队列,等待promise解决?还是只有在promise解决后才将then()的回调插入作业队列?

最佳答案

当需要调用 promise 回调时,作业根本不会进入标准作业队列 (ScriptJobs);它进入 PromiseJobs 队列。当 ScriptJobs 队列中的每个作业结束时,PromiseJobs 队列将被处理直到它为空。 (规范中有更多信息:Jobs and Job Queues。)

我不确定您期望从您的代码中得到什么输出,因为您没有说,但让我们举一个更简单的例子:

console.log("top");
new Promise(resolve => {
setTimeout(() => {
console.log("timer callback");
}, 0);
resolve();
})
.then(() => {
console.log("then callback 1");
})
.then(() => {
console.log("then callback 2");
});
console.log("bottom");

可靠的输出是:

topbottomthen callback 1then callback 2timer callback

因为:

  1. 运行该脚本的 ScriptJobs 作业
  2. console.log("top")运行
  3. promise 执行器函数代码运行,
    • “立即”安排一个计时器作业,该作业将立即或几乎立即进入 ScriptJobs 队列
    • 通过调用 then 履行 promise (这意味着 promise 在调用 resolve 之前得到解决)没有参数(这实际上就像用 undefined 调用它,不是 thenable 会触发 promise 的实现)。
  4. 第一个then连接第一个履行处理程序,将 PromiseJobs 作业排队,因为 promise 已经履行
  5. 第二个then连接第二个履行处理程序(不排队作业,等待第一个 then 的 promise )
  6. console.log("bottom")运行
  7. 当前 ScriptJob 作业结束
  8. 引擎处理正在等待的 PromiseJobs 作业(第一个履行处理程序)
  9. 输出"then callback 1"并满足第一个 then的 promise (通过返回)
  10. 将 PromiseJobs 队列中的另一个作业排队等待回调到第二个履行处理程序
  11. 由于 PromiseJobs 队列不为空,因此将选取并运行下一个 PromiseJob
  12. 第二个执行处理程序输出 "then callback 2"
  13. PromsieJobs 为空,因此引擎会选择下一个 ScriptJob
  14. 那个 ScriptJob 处理定时器回调并输出 "timer callback"

在 HTML 规范中,他们使用的术语略有不同:“任务”(或“宏任务”)用于 ScriptJobs 作业,“微任务”用于 PromiseJobs 作业(和其他类似作业)。

关键点是:所有在 ScriptJob 期间排队的 PromiseJobs 都在该 ScriptJob 完成时处理,并且包括 它们 队列中的任何 PromiseJobs;只有当 PromiseJobs 为空时,才会运行下一个 ScriptJob。

关于javascript - 作业队列如何与 promise 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59846764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com