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();
View Code

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
原文地址:https://www.cnblogs.com/luoyangyang/p/11584855.html