【问题标题】:Is the JavaScript ES promise fulfillment handler job queue executed before all the setTimeout and setInterval handler queue? [duplicate]JavaScript ES 承诺履行处理程序作业队列是否在所有 setTimeout 和 setInterval 处理程序队列之前执行? [复制]
【发布时间】:2019-12-25 09:55:15
【问题描述】:

以下代码:

let promise = new Promise(function(resolve, reject) {
    console.log("resolve, reject are", resolve, reject);

    resolve("this is the success data");
    console.log("Point A");
    setTimeout(function() { console.log("Point B"); }, 0);
});

promise.then(
  function(a) { 
    console.log("Success.", a); 
    setTimeout(function() { console.log("Point C"); }, 0);
    promise.then(function(a) { console.log("Go have a drink.", a); });
  },
  function(a) { 
    console.log("failure", a) 
  }
);

console.log("Point D");

将“Point B”和“Point C”的打印添加到作业队列中,然后打印出“Go have a drink”的处理程序也添加到作业队列中。但是在 Node 和 Google Chrome 的结果中,“去喝一杯”打印在“点 B”和“点 C”之前。是不是promise有一个单独的job queue,setTimeoutsetInterval有一个单独的job queue,promise job queue是在timed job queue之前执行的? It seems the ES6 specs mentioned two job queues: ScriptJobs and PromiseJobs。我们可以指望在定时作业队列之前执行的承诺作业队列吗?

【问题讨论】:

    标签: javascript ecmascript-6 promise settimeout job-queue


    【解决方案1】:

    是的。承诺解决处理程序,如.thenawait,被称为微任务。它们总是在当前运行的所有其他 同步 Javascript 完成后立即执行。

    其他微任务产生的微任务也将立即运行(直到所有微任务都完成,并且微任务队列中没有任何内容)。

    微任务的其他示例是 process.nextTickqueueMicrotask

    相比之下,setTimeout 回调是宏任务,它每隔几毫秒(在事件队列的每次迭代期间)运行(最多)一个,这不是即时的。

    【讨论】:

    • 感谢您的解释。 ES6 规范提到了 ScriptJobs 和 PromiseJobs,而不是 microtask 和 macrotask。所以整个 PromiseJobs 作业队列都只是充满了微任务?并且 ScriptJobs 作业队列中充满了宏任务?
    • 宏任务及其 API 由实现处理,就像浏览器一样——ECMAScript 标准本身没有指定它们的行为。另一方面,微任务可以是:参见Jobs and Job Queues只有在没有运行的执行上下文且执行上下文堆栈为空时才能启动作业的执行。 PendingJob 是对未来执行 Job 的请求。
    • 队列中的 ScriptJobs 会在作业堆栈为空时立即运行 - 它们也是微任务,就像 .thens 一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2021-11-02
    • 2018-11-21
    • 1970-01-01
    • 2019-07-12
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多