若是event loop 进入了poll阶段,且代码未设定timer,将会发生下面的状况:node
若是event loop进入了poll阶段,且代码设定了timer:浏览器
setImmediate约定于setTimeout(cb,0)
path.resolve() 方法会把一个路径或路径片断的序列解析为一个绝对路径。异步
__dirname 老是指向当前文件夹的绝对路径socket
__filename 老是指向当前文件的绝对路径函数
note:oop
- 执行代码1
var fs = require('fs'); var path = require('path'); function someAsyncOperation(callback) { // 花费2ms fs.readFileSync('./read.txt', callback); } var timeoutScheduled = Date.now(); var fileReadTime = 0; setTimeout(function() { var delay = Date.now() - timeoutScheduled; console.log(`setTimeout ${delay} ms have passed since I was sheculed`); console.log('fileReaderTime', fileReadTime - timeoutScheduled); }, 10); someAsyncOperation(function() { fileReadtime = Date.now(); while (Date.now() - fileReadTime < 20) {} });
- 执行代码2
var fs = require('fs'); var path = require('path'); function someAsyncOperation(callback) { // 花费9ms fs.readFileSync('./read.txt', callback); } var timeoutScheduled = Date.now(); var fileReadTime = 0; setTimeout(function() { var delay = Date.now() - timeoutScheduled; console.log(`setTimeout ${delay} ms have passed since I was sheculed`); console.log('fileReaderTime', fileReadTime - timeoutScheduled); }, 5); someAsyncOperation(function() { fileReadtime = Date.now(); while (Date.now() - fileReadTime < 20) {} });
- 执行代码3
setImmediate(() =>{ console.log('setImmediate') },0) setTimeout(() =>{ console.log('setTimeout') },0) // setTimeout 和 setImmediate的执行顺序不肯定 // 由于event loop的启动也是须要时间的,可能执行到poll阶段时已经超过了1ms,此时setTimeout会先执行
const fs = require('fs'); const path = require('path'); fs.readFile(path.resolve(__dirname, '/read.txt'), () => { setTimeout(() => { console.log('setTimeout'); }, 0); setImmediate(() => { console.log('setImmediate'); }, 0); }); // 执行顺序是肯定的, setImmediate,setTimeout