【转】coordcn关于《Node.js最新技术栈之Promise篇》的评论

不管是promise,还是generator/yield,还是async/await都不能代表异步的未来,异步的未来是没有显式的异步,是形式同步。

现在nodejs的异步模型是受限于javascript历史和现实的妥协产物。

这个世界是异步的吗?这个世界是异步的。我们可以跟其他人或物协作,形成异步,但就我们个体而言,我们是同步的,因为我们只有一个大脑。当我们只有一个人的时候,我们能做的顶多是将事情排个优先级,先做什么后做什么,但事情还是得由自己一个个去做。异步的本质是借助外部资源与自己协同做事情。

这个世界是并行的吗?这个世界是并行的。我们可以将任务分发给其他人或物,并行执行,但就我们个体而言,我们是无法并行的,因为我们只有一个大脑。当我们只有一个人的时候,我们就无法并行。并行的本质是借助外部资源一起做事情。

一句话概括起来就是,这个世界是异步,是并行的,但我们每个人却不是,在没有外部资源配合的时候,我们只能顺序同步的一件件完成任务。当然这个结论对某些牛人而言是不正确,他们或许可以自己跟自己异步,自我并行。。。

我们需要跟其他人合作,我们需要团队资源,我们需要异步,需要并行。但请注意,我们真正需要的不是异步和并行本身,而是由他们带来的好处,带来的效率上的提升。异步和并行是需要代价的,跟其他人合作,就要有沟通,如果团队沟通出现了问题,团队效率可能会不及个人。沟通方式是非常重要的,可以通过消息提醒,可以通过回调。消息提醒是人类常用的,我们要分一定的神去关注别人的消息,还要过滤垃圾消息,提取有用的,这个模式对小规模的业务是有效的,每个人专注一两件事情。回调则是按照我们规划好的,一层层响应关系事先注册好了,来了订单,形成了生产命令,经理注册的审批回调就触发了,经理审批完成,财务注册的财务审核的回调又触发了,财务审核通过,采购注册的采购回调,车间注册的生产回调触发了,开始备料,采购到货,品管注册的来料检验回调触发了,如此一层层的回调自动的触发下去,直至最终货到客户手中。回调由于是事先规划好了信息传递他规则,不需要一层层的检索信息,再进行转发,每个注册回调的人员都能及时的做自己该做的事情。从这个意义上来说,回调模式下的流程管理比消息转发模式高效得多。

这个例子其实不是要告诉大家回调好厉害,好伟大,这个大家都清楚。这个例子是要告诉大家,回调的本质,回调就是来保证执行顺序的,是保证流程的,这个过程中不管是异步,并行,都被层层注册的回调控制得死死的,先做什么后做什么,事先已经规划好,订单来了,经理不批,后面的流程就走不下去。讲到这里,聪明的人已经理解了我的用意,千万不要以为回调就是异步,回调跟异步半毛钱的关系都没有(同步代码,只要你愿意,同样可以用回调来表达),回调这个模式只是碰巧(相对效率高)能够准确的表达异步,能够有效的约束异步关系,形成准确的执行链条。回调保证的其实是同步,是顺序,是业务逻辑上的同步和顺序执行。

世界是异步的,世界是并行的,特么业务逻辑竟然是同步的,是顺序执行的。这就是nodejs异步痛苦的根源,这也是很多人不愿意承认的矛盾。这个矛盾也恰恰是promise,generator/yield,async/await出现的原因,但他们都不完美,他们或多或少的都要兼容过去的回调代码,这是语言的历史和现实造成的,估计短时间改变的可能性不大。

如何实现形式同步,如何隐藏回调,大家都在探索,fibjs,openresty,很多项目都在做,转换和隐藏回调的钥匙在协程。

总之,请记住,你所要写的业务代码逻辑上总是同步的顺序的,nodejs痛苦的根源就是用显式的异步代码去表达同步顺序的业务逻辑,你的内心,其实希望写同步代码。

来源:

https://cnodejs.org/topic/560dbc826a1ed28204a1e7de

此条目发表在NodeJs分类目录。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注