欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Node.js】学习记录6-node里的异步编程和事件循环

程序员文章站 2022-04-18 18:31:14
...

文章目录

异步编程

啥是异步这个就不说了,前端老生常谈了。

node里的回调函数是有格式规范的:

  • error-first callback
  • Node-style callback

意思就是回调参数第一个参数是error,第二个是回调执行的结果,node的异步编程其实迭代了几次,目前的用法有Promise、Async(好像不遵循格式规范了?)。

没想到Promise是从node先来的,后来才被加到es6中,所以这里可以直接看【es6入门】Promise与Async的异步写法

事件循环

这个是前端的也不说了。可以直接去做一些题巩固一下:【JS基础】搞定事件循环机制的基础面试题

事件循环比较熟练的这里放个题看看:

try {
  interview(function (err, res) {
    if (err) {
      console.log('cry')
      return;
    }
    console.log(res)
  })
} catch (e) {
  console.log('cry')
}

function interview(callback) {
  setTimeout(() => {
    if (Math.random() > 0.2) {
      callback(null, 'success')
    } else {
      throw new Error('fail');
    }
  }, 500)
}

整个文件用node运行,如果interview抛出问题,为啥是全局node报的错误呢?原因是try catch只能抓到调用堆栈内一个成员,即一个事件循环里的错误,并报给下一个循环去捕捉这个错误。例如A循环里抛出的错误,要到下个B循环里才能捕捉到。

在try函数interview的时候,内部调用了setTimeout,setTimeout是又一个独立循环事件,所以setTimeout的错误interview捕捉不到,所以由全局的node去报这个错误。

改成这样就ok:

try {
  interview(function (err, res) {
    if (err) {
      console.log('cry')
      return;
    }
    console.log(res)
  })
} catch (e) {
  console.log('cry')
}

function interview(callback) {
  if (Math.random() > 0.2) {
    callback(null, 'success')
  } else {
    throw new Error('fail');
  }
}
相关标签: Node.js