Node.js异步机制造成的坑

Node.js所有程序都是异步执行的,导致程序执行的过程中可能会有一些坑的存在。

比如如下一段代码:

flag = init_mongodb(jsonconfig);
if (flag != NOERROR) {
      console.log(flag);
      mylogger.logWarn("Database connect error!");
      process.exit();
}

此段代码中init_mongodb()函数初始化了mongodb,链接成功后返回一个返回值,用于下面的判断,要不对的话就弹出程序。

但这里就遇到一个问题:Node.js的机制是异步的,在执行到if一句时flag还是undefined状态。

所以此处就涉及到了怎么实现回调的问题了。知乎大神是这样解释的:

js 本来就是异步的,要不是callback,要不是 Promise,没法同步写代码

异步函数按顺序执行是老问题了,有各种各样的方法,Callback就跳过不说了。

  • Promise:代码:A Pen by Xiangyun Chi**原理:使用Promise.resolve将返回值变成Promise,之后就可以chain promise.then了。
  • Event Emitter:****代码:A Pen by Xiangyun Chi**原理: 将每个函数封装成EventEmitter,在函数执行完成时emit事件,之后将每个函数的on('end') 设成数组里的下一个函数。
  • Co + Generator:****代码:A Pen by Xiangyun Chi**原理:Co(GitHub - tj/co: The ultimate generator based flow-control goodness for nodejs (supports thunks, promises, etc)**)是能将Generator转变成async await形式的库。 主要使用generator的yield和next进行Control Flow。
  • Async Await:代码:A Pen by Xiangyun Chi**原理:这也是最简单最推荐的,ES7的Async Await能让异步函数使用的像同步函数一样。

作者:yjcxy12 链接:https://www.zhihu.com/question/39711453/answer/91885082来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最后这个问题我把回调加到了函数callback里了事。但详细研究还是应该用更好的方法。
然后,我找到了(2017,我们来聊聊 Node.js)[https://cnodejs.org/topic/58eee565a92d341e48cfe7fc]这篇文章

文章中写到对于node.js首先需要建立的一个概念就是:
Node.js是为异步而生的,它自己把复杂的事儿做了(高并发,低延时),交给用户的只是有点难用的Callback写法。
所以更好的解决方法是Async函数和Promise

  • Async函数是趋势,Chrome 52. v8 5.1已经支持Async函数(https://github.com/nodejs/CTC/issues/7)了,Node.js 7.0+支持还会远么?
  • Async和Generator函数里都支持promise,所以promise是必须会的。
  • Generator和yield异常强大,不过不会成为主流,所以学会基本用法和promise就好了,没必要所有的都必须会。
  • co作为Generator执行器是不错的,它更好的是当做Promise 包装器,通过Generator支持yieldable,最后返回Promise,是不是有点无耻?

有如下的图:

Node.js异步机制造成的坑_第1张图片
回调机制

红色代表Promise,是使用最多的,无论async还是generator都可用
蓝色是Generator,过渡货
绿色是Async函数,趋势

你可能感兴趣的:(Node.js异步机制造成的坑)