Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript ES承诺履行处理程序作业队列是否在所有setTimeout和setInterval处理程序队列之前执行?_Javascript_Ecmascript 6_Promise_Settimeout_Job Queue - Fatal编程技术网

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。