1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| Promise.resolve().then(() => console.log('p1')); Promise.resolve().then(() => { console.log('p2'); Promise.resolve().then(() => console.log('p3')); }); Promise.resolve().then(() => { console.log('p4'); process.nextTick(() => console.log('tick1')); }); Promise.resolve().then(() => console.log('p5')); Promise.resolve().then(() => console.log('p6'));
setImmediate(() => console.log('immediate1')); setImmediate(() => { console.log('immediate2'); process.nextTick(() => console.log('tick2')); Promise.resolve().then(() => { console.log('p7'); process.nextTick(() => console.log('tick3')); }); setImmediate(() => console.log('immediate3')); });
process.nextTick(() => console.log('tick4')); process.nextTick(() => { console.log('tick5'); process.nextTick(() => console.log('tick6')); }); process.nextTick(() => console.log('tick7'));
setTimeout(() => { console.log('timeout1'); setTimeout(() => console.log('timeout2'), 0); }, 0);
setImmediate(() => console.log('immediate4')); setImmediate(() => console.log('immediate5'));
promises队列: [p1,p2,p4, p5, p6, p3, p7] ticks队列:[tick4,tick5, tick7, tick6, tick1, tick2, tick3] immediate队列: [immediate1,immediate2, immediate4, immediate5, immediate3] settimeout队列: [timeout1, timeout2]
tick4, tick5, tick7, tick6 p1, p2, p4, p5 , p6, p3 tick1, timeout1, immediate1, immediate2, tick2, p7 , tick3, immediate4, immediate5, timeout2 immediate3
总结: 1. 进入每个事件循环阶段都会优先执行微任务(process.nextTick和Promise) 2. 每次执行到某个阶段,会复制已完成任务队列,这就是immediate3为什么会在timeout2后面输出
|