scott好,
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | const { readFile, readFileSync } = require( 'fs' ) setImmediate(() => console.log( '[阶段3.immediate] immediate 回调1' )) setImmediate(() => console.log( '[阶段3.immediate] immediate 回调2' )) setImmediate(() => console.log( '[阶段3.immediate] immediate 回调3' )) Promise.resolve() .then(() => { console.log( '[...等待切入下一个阶段] promise 回调 1' ) setImmediate(() => console.log( '[阶段3.immediate] promise 回调1 增加的 immediate 回调4' )) }) readFile( '../package.json' , 'utf-8' , data => { console.log( '[阶段2...IO 回调] 读文件回调1' ) readFile( '../package-lock.json' , 'utf-8' , data => { console.log( '[阶段2...IO 回调] 读文件回调2' ) setImmediate(() => console.log( '[阶段3.immediate] 读文件回调2 增加的 immediate 回调4' )) }) setImmediate(() => { console.log( '[阶段3.immediate] immediate 回调5' ) Promise.resolve() .then(() => { console.log( '[...等待切入下一个阶段] promise 回调 2' ) process.nextTick(() => { console.log( '[...待切入下一个阶段] promise 回调2增加的 nextTick 回调5' ) }) }) .then(() => { console.log( '[...等待切入下一个阶段] promise 回调 3' ) }) }) setImmediate(() => { console.log( '[阶段3.immediate] immediate 回调6' ) process.nextTick(() => { console.log( '[...待切入下一个阶段] immediate 回调6 nextTick 回调7' ) }) console.log( '[...待切入下一个阶段] 这块正在同步阻塞的读一个大文件' ) const video = readFileSync( '../package-lock.json' , 'utf-8' ) process.nextTick(() => { console.log( '[...待切入下一个阶段] immediate 回调6 nextTick 回调8' ) }) readFile( '../package.json' , 'utf-8' , data => { console.log( '[阶段2...IO回调] 读文件回调3' ) setImmediate(() => console.log( '[阶段3.immediate] 读文件回调3 增加的 immediate 回调6' )) setTimeout(() => console.log( '[阶段1...定时器] 读文件回调3 增加的 定时器回调8' ), 0) }) }) process.nextTick(() => { console.log( '[...待切入下一个阶段] 读文件 回调1 增加的 nextTick 回调6' ) }) setTimeout(() => console.log( '[阶段1...定时器] 定时器 回调5' ), 0) setTimeout(() => console.log( '[阶段1...定时器] 定时器 回调6 ' ), 0) }) setTimeout(() => console.log( '[阶段1...定时器] 定时器 回调1' ), 0) setTimeout(() => { console.log( '[阶段1...定时器] 定时器 回调2' ) process.nextTick(() => { console.log( '[...待切入下一个阶段] nextTick 回调5' ) }) }, 0) setTimeout(() => console.log( '[阶段1...定时器] 定时器 回调3' ), 0) setTimeout(() => console.log( '[阶段1...定时器] 定时器 回调4' ), 0) process.nextTick(() => console.log( '[...待切入下一个阶段] nextTick 回调1' )) process.nextTick(() => { console.log( '[...待切入下一个阶段] nextTick 回调2' ) process.nextTick(() => console.log( '[...待切入下一个阶段] nextTick 回调4' )) }) process.nextTick(() => console.log( '[...待切入下一个阶段] nextTick 回调3' )) |
在执行timers阶段70行~79行中的这个打印的setTimout中有一个nextTick([...待切入下一个阶段] nextTick 回调5,执行完这个后
就该进入到第二阶段,但是为什么图中,我画框的打印中,第三阶段的immediate会比异步IO先执行呢?同样的,后面的一个框也是这样的问题,我没有想明白这是为什么?