- 什么是同步异步
- 什么是异步IO
- 什么是阻塞非阻塞
- 什么是事件循环与事件驱动
- 什么是单线程
- 什么是进程
- 什么是子进程
- 怎么样来启动子进程
- 进程间如何通信
同步异步与阻塞
const doSync = (sth, time) => new Promise(resolve => {
setTimeout(() => {
console.log(sth + '用了' + time + '毫秒')
resolve()
}, time)
})
const doAsync = (sth, time, cb) => {
setTimeout(() => {
console.log(sth + '用了' + time + '毫秒')
cb && cb() // 如果有回调的话,就执行回调函数
}, time)
}
const doElse = (sth) => {
console.log(sth)
}
const Scott = { doSync, doAsync }
const Meizi = { doSync, doAsync, doElse }
;(async () => {
// 同步
console.log('case1: 妹子来到门口')
await Scott.doSync('Scott 刷牙', 1000)
console.log('啥也没干,一直等')
await Meizi.doSync('妹子洗澡',2000)
Meizi.doElse('妹子去忙别的了')
// 异步
console.log('case3: 妹子来到门口按下通知开关')
Scott.doAsync('Scott 刷牙', 1000, () => {
console.log('卫生间通知妹子来洗澡')
Meizi.doAsync('妹子洗澡', 2000)
})
Meizi.doElse('妹子去忙别的了')
})()
event loop 6个阶段
const { readFile } = require('fs')
const EventEmitter = require('events')
class EE extends EventEmitter {}
const yy = new EE()
yy.on('evnet', () => {
console.log('出大事了!')
})
setTimeout(() => {
console.log('0 毫秒后到期执行的定时器回调')
},0)
setTimeout(() => {
console.log('100 毫秒后到期执行的定时器回调')
},100)
setTimeout(() => {
console.log('200 毫秒后到期执行的定时器回调')
},200)
readFile('../package.json','utf-8', data => {
console.log('完成文件 1 读操作的回调')
})
readFile('../README.md','utf-8', data => {
console.log('完成文件 2 读操作的回调')
})
setImmediate(() => {
console.log('immediate 立即回调')
})
process.nextTick(() => {
console.log('process.nextTick 的回调')
})
Promise.resolve()
.then(() => {
yy.emit('evnet')
process.nextTick(() => {
console.log('process.nextTick的第2次回调')
})
console.log('Promise 的第 1 次回调')
})
.then(() => {
console.log('Promise 的第2次回调')
})
输出结果:
process.nextTick 的回调
出大事了!
Promise 的第 1 次回调
Promise 的第2次回调
process.nextTick的第2次回调
0 毫秒后到期执行的定时器回调
immediate 立即回调
完成文件 1 读操作的回调
完成文件 2 读操作的回调
100 毫秒后到期执行的定时器回调
200 毫秒后到期执行的定时器回调
参考地址
https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/