javascript - JavaScript ES promise 履行处理程序作业队列是否在所有 setTimeout 和 setInterval 处理程序队列之前执行?

标签 javascript ecmascript-6 promise settimeout job-queue

以下代码:

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 是否真的有一个单独的作业队列和 setTimeoutsetInterval有一个单独的作业队列,并且promise作业队列在定时作业队列之前执行? It seems the ES6 specs mentioned two job queues: ScriptJobs and PromiseJobs 。我们可以指望 Promise 作业队列在定时作业队列之前执行吗?

最佳答案

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

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

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

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

关于javascript - JavaScript ES promise 履行处理程序作业队列是否在所有 setTimeout 和 setInterval 处理程序队列之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59477200/

相关文章:

javascript - 在标准 ES 6 类中添加 getter 方法有什么意义吗?

javascript - 在另一个文件中使用时找不到 module.exports 值

javascript - (Nodejs + Restify)发送后无法设置标题 - promise 拒绝警告

javascript - Jquery/bootstrap 禁用按钮

javascript - 在 Javascript 中检查某个字符是否是任何书面语言中的元音的最佳方法

javascript - CSS3 过渡 : replace them entirely on mobile?

javascript - 如何使用javascript更改android webView的字体

javascript - es6 querySelectorAll 一个类并获取它的数据属性

dart - Futures/Promises,并追踪错误

javascript - Promise.all 错误 : Uncaught (in promise) TypeError: #<Promise> is not iterable