2

以下代码:

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");

将“点 B”和“点 C”的打印添加到作业队列中,之后,打印出“去喝一杯”的处理程序也添加到作业队列中。但是在 Node 和 Google Chrome 的结果中,“去喝一杯”在“点 B”和“点 C”之前打印。是不是promise有单独的job queue和setTimeoutandsetInterval有单独的job queue,promise job queue是在timed job queue之前执行的?似乎 ES6 规范提到了两个作业队列: ScriptJobs 和 PromiseJobs。我们可以指望在定时作业队列之前执行的承诺作业队列吗?

4

1 回答 1

3

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

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

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

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

于 2019-12-25T09:58:00.407 回答