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,是不是有点无耻?
有如下的图:
红色代表Promise,是使用最多的,无论async还是generator都可用
蓝色是Generator,过渡货
绿色是Async函数,趋势