zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    ubuntu安装iscsi
    函数模板的trick
    EF-Code First(5):二级缓存
    了解线程的属性及方法
    算法--中位数计算
    实习面试
    长轮询实现Chat并迁移到Azure测试
    非聚集索引及其性能优化
    架构设计方案
    大话数据结构-图
  • 原文地址:https://www.cnblogs.com/luoyangyang/p/11584855.html
Copyright © 2011-2022 走看看