以下代码:
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 是否真的有一个单独的作业队列和 setTimeout
和setInterval
有一个单独的作业队列,并且promise作业队列在定时作业队列之前执行? It seems the ES6 specs mentioned two job queues: ScriptJobs and PromiseJobs 。我们可以指望 Promise 作业队列在定时作业队列之前执行吗?
最佳答案
是的。 Promise 解析处理程序,例如 .then
和 await
,称为微任务。它们始终会在当前运行的所有其他同步 Javascript 完成后立即执行。
其他微任务产生的微任务也将立即运行(直到所有微任务完成,并且微任务队列中没有留下任何内容)。
微任务的其他示例是 process.nextTick
和 queueMicrotask
。
相比之下,setTimeout
回调是宏任务,(最多)每隔几毫秒运行一次(在事件队列的每次迭代期间),这不是即时的。
关于javascript - JavaScript ES promise 履行处理程序作业队列是否在所有 setTimeout 和 setInterval 处理程序队列之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59477200/