setImmediate该方法用来把一些需要长时间运行的操作放在一个回调函数里,在浏览器完成后面的其他语句后,就立刻执行这个回调函数。
setImmediate是宏任务,优先级是比定时任务低的。除非在定时任务中。
测试代码:
1setImmediate(function(){ 2 console.log("setImmediate"); 3 setImmediate(function(){ 4 console.log("setImmediate-setImmediate"); 5 }); 6 setTimeout(function(){ 7 console.log("setImmediate-setTimeout"); 8 }); 9 process.nextTick(function(){ 10 console.log("setImmediate-nextTick"); 11 }); 12}); 13setTimeout(function(){ 14 console.log("setTimeout"); 15 setTimeout(function(){ 16 console.log("setTimeout-setTimeout"); 17 }); 18 setImmediate(function(){ 19 console.log("setTimeout-setImmediate"); 20 }); 21 process.nextTick(function(){ 22 console.log("setTimeout-nextTick"); 23 }); 24}); 25process.nextTick(function(){ 26 console.log("nextTick"); 27 setImmediate(function(){ 28 console.log("nextTick-setImmediate"); 29 }); 30 setTimeout(function(){ 31 console.log("nextTick-setTimeout"); 32 }); 33 process.nextTick(function(){ 34 console.log("nextTick-nextTick"); 35 }); 36});
结果如下:
1nextTick 2nextTick-nextTick 3setTimeout 4nextTick-setTimeout 5setTimeout-nextTick 6setImmediate 7nextTick-setImmediate 8setTimeout-setImmediate 9setImmediate-nextTick 10setTimeout-setTimeout 11setImmediate-setTimeout 12setImmediate-setImmediate
解析:
1// 第一圈 2nextTick //优先执行微任务 3nextTick-nextTick //优先执行微任务,直到完成所有微任务 4setTimeout //接下来执行到时间的定时任务 5nextTick-setTimeout //直到完成所有定时任务 6setTimeout-nextTick //完成所有定时任务,后才会执行完所有新增的微任务 7setImmediate //最后执行宏任务 8nextTick-setImmediate //直到完成所有宏任务 9setTimeout-setImmediate //直到完成所有宏任务 10// 第二圈 11setImmediate-nextTick //优先执行微任务 12setTimeout-setTimeout //接下来执行到时间的定时任务 13setImmediate-setTimeout //直到完成所有定时任务 14setImmediate-setImmediate //最后执行宏任务