nodejs基础知识
饿了么面试:https://elemefe.github.io/node-interview/#/sections/zh-cn/
node流的概念:https://juejin.im/post/5940a9c3128fe1006a0ab176
node的单线程
node.js单线程只是一个js主线程,本质上的异步操作还是由线程池完成的,node将所有的阻塞操作都交给了内部的线程池去实现,本身只负责不断的往返调度,
并没有进行真正的I/O操作,从而实现异步非阻塞I/O。
重点在主线程为单线程,主线程执行代码形成一个执行栈
主线程之外维护一个事件队列,当IO或异步操作,会将事件放到Event queue中,并不会执行且继续执行主线程代码,不会阻塞,直到主线程代码完毕。
主线程执行完毕,循环去取事件,用线程池线程去执行事件。当有事件执行完毕后,会通知主线程,主线程执行回调,线程归还给线程池。
一定注意异步问题,可使用promise,实现代码如下
1 // 遇到需要同步执行的代码,promise化,await执行,外层一定要有async 2 function formImage() { 3 return new Promise((resolve, reject) => { 4 form((opt, {fields, files})=> { 5 console.log(files) 6 let filename = files.file.name 7 console.log(files.file.path) 8 let uploadDir = config.ROOTPATH + `/tmp/${roomId}/` 9 let relativePath = `/tmp/${roomId}/` + Date.now() + '_' + filename 10 mkdirs(uploadDir, () => { 11 fs.renameSync(files.file.path, config.ROOTPATH + relativePath) //重命名 12 resolve(relativePath) 13 }) 14 }) 15 }) 16 } 17 let p = await formImage();
Node.js等则规定在JavaScript的回调函数的第一个参数为 Error 对象,这也是它的一个惯例。
npm install packageName --save //安装到项目目录下,并在package.json文件的dependencies中写入依赖,简写为-S
数据类型symbol:为了解决属性名重复的问题,symbol值是通过symbol函数生成的,肯定是独一无二
class:constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
调用要用 new Class()
事件驱动的过程
所有的东西包装成一个对象,执行了一个事件循环
事件驱动,把所有的东西都当成一个事件
while(true){
// 无限循环
}
###不同的异步,不同的优先级
while(true){
第一步: 执行script(全部的代码)
先去清空micor-task队列的事件,去把这里面的全部执行完
再去找 setInterval 执行 再去清空micor-task队列
再去找 setImmediate 执行,再去清空micor-task队列
再去 I/O 操作 再去清空micro-task队列
}
虽然都是异步,但是是有优先级的
macro-task:队列 script(全部的代码)
script(全部的代码) setInterval() setTimeout() setImmediate() I/O操作(读写,查询数据库)
他们都是同步的,但是他们的回调函数是异步的
micro-task:队列
process.nextTick() Promise().then()
注意 setInterval()和setTimeout()优先级是一样的
异步事件的优先级
nextTick > Promise.then > setTimeout > setImmediate