JavaScript ES承诺履行处理程序作业队列是否在所有setTimeout和setInterval处理程序队列之前执行?
以下代码:JavaScript ES承诺履行处理程序作业队列是否在所有setTimeout和setInterval处理程序队列之前执行?,javascript,ecmascript-6,promise,settimeout,job-queue,Javascript,Ecmascript 6,Promise,Settimeout,Job Queue,以下代码: let promise=新承诺(函数(解析、拒绝){ 日志(“解析,拒绝”,解析,拒绝); 解决(“这是成功数据”); 控制台日志(“A点”); setTimeout(函数(){console.log(“点B”);},0); }); 我保证,那么( 函数(a){ console.log(“Success.”,a); setTimeout(函数(){console.log(“点C”);},0); 然后(函数(a){console.log(“去喝一杯。”,a);}); }, 函数(a)
let promise=新承诺(函数(解析、拒绝){
日志(“解析,拒绝”,解析,拒绝);
解决(“这是成功数据”);
控制台日志(“A点”);
setTimeout(函数(){console.log(“点B”);},0);
});
我保证,那么(
函数(a){
console.log(“Success.”,a);
setTimeout(函数(){console.log(“点C”);},0);
然后(函数(a){console.log(“去喝一杯。”,a);});
},
函数(a){
console.log(“失败”,a)
}
);
控制台日志(“D点”)代码>是。承诺解析处理程序,如。then
和wait
,称为微任务。它们总是在当前运行的所有其他同步Javascript完成后立即执行
其他微任务生成的微任务也将立即运行(直到所有微任务完成,并且微任务队列中没有任何内容)
微任务的其他示例有process.nextTick
和queueMicrotask
相比之下,setTimeout
回调是宏任务,它(最多)每隔几毫秒(在事件队列的每次迭代期间)运行一次,这不是即时的。感谢您的解释。ES6规范提到了ScriptJobs和PromiseJobs,而不是microtask和macrotask。那么整个PromiseJobs作业队列都是微任务?ScriptJobs作业队列中充满了宏任务?宏任务及其API由实现处理,就像浏览器一样——ECMAScript标准本身没有指定它们的行为。另一方面,微任务可以是:参见:只有在没有运行的执行上下文且执行上下文堆栈为空时,才能启动作业的执行。PendingJob是对将来执行作业的请求。队列脚本作业在作业堆栈为空时立即运行-它们也是微任务,就像。然后s。