Nodejs 写多了也是一种病
发布于 8 年前 作者 jingsam 5279 次浏览 来自 分享

最近几个月都在写nodejs代码,发现自己有点焦虑症的倾向了,主要表现在:

  1. 如果同一个函数有同步版本和异步版本,用同步版本会深深地自责,即使有些情况下用同步版本明显会简化逻辑;
  2. 写代码的时候会小心翼翼,怀疑每行代码都有出错的可能,如果一个函数没有在回调中返回err参数,会感觉失去了安全感;
  3. 实现一个功能首先会到npm上搜一搜有没有现成的包,即使这个功能很简单,也不愿意自己动手写一个,原因在于生怕自己对edge cases考虑不周。要是碰到有多个现成的包,又会花很长时间比较。
28 回复

嗯,碰到多个现成的包,我也会去比较

写node就是还没开始写,现成的包已经帮你完成90%了

@Qquanwei 关键是包太多了,质量参差不齐,而且npmjs的搜索功能又屎,不知道用哪个好

第一点赞成,所以我反对使用 promise 和小菊花什么的

@xadillax 对,有些包只暴露promise接口,我觉得有一股坏味道

现在对我来说callback hell 已经不是问题了, promise 也好 / callback 也罢(大不了我自己 promisify 吗), 异步就好… 要是同步版本反而会担心阻塞 EventLoop, 像我发现 crypto 模块, hash / hmac / ciper / deciper 都是同步的, 会阻塞 还有一点就是 GC 经常出问题 … 风扇狂转 / cpu 100% / 内存飙高 … 甚是蛋疼

暴露 promise 接口怎么是坏味道了… 那你放心, in the coming soon … async/await 变的不用 babel 了, 大家都写 async function fn 了, 然后fn() 都是 Promise 了哈哈哈

@magicdawn 用promise, generator,aync/await都是自己的选择,如果你开发一个包,API应该以原生的callback方式暴露,而不应该强迫别人用promise。nodejs的设计也是选择了原生的callback而放弃了promise,我们应该遵循这个惯例

@magicdawn async/await 和 Promise有关系吗? Promise和异步也没关系,甚至generator和异步也没关系, Promise是维护内部状态的一个封装,要理解这一点就好办了。 我现在有一些同步代码,适合时也会写成Promise,为的就是这个规范的状态封装。

@magicdawn 我也不认为async/await会成为终极的解决方案。我会预见到当async/await大规模使用时,一些问题会随着用例的增多逐渐地显现出来,到时候大家又会回到原生的callback。因为你用同步的思维写异步程序,终究是个错误的方向

@jingsam 未必吧

我封装api的时候,仍然是callback的,但promise极其重要,如果必要我也会加的。

对于未来,promise是最重要,最通用,所以它是每个node工程师必会的技能

@captainblue2013

有关系啊, 一个 async function 的返回值是一个 Promise 实例啊

最后一个会比较,还要去gitbub上看star。。。。

@jingsam

对, 用 promise.then / 用 co 去 yield / 用 babel 去 await 是自己的选择, 但是你有没有发现, 他们只有一点要求, 即是你接口返回 Promise 值, 三者普适… 哈哈哈~你用 callback 也没人拦你… 不过 mogoose / sequelize blabla 的库在往这边转哦 最后安利下 https://cnodejs.org/topic/573b2d64fcf698421d20359d

@jingsam

你赢了…我现在不关注 callback hell 的问题了… 哈哈哈 … 因为我能解决, bye …

@guojinlong star也不能完全说明问题,有的包1000多个star,结果一看近一年都没更新了,issue里面一大堆问题也没人管

btw node 不是放弃了原生使用 Promise 的, 这个先有鸡还是先有蛋的问题… 不多说 … nodejs/node issue 有讨论

加上一点: callback event promise when then bluebird co defferred yield async await express koa koa2 angular react vuejs middleware 自从我开始写nodejs就患上了概念恐惧症,第天在论坛里都看到新概念。不管怎么升级,总觉得不够等级。

@zouzhenxing 不必了解那么多,先用就好了嘛,用啥学啥

@magicdawn 2009 年,Kris Zyp 有感于dojo.Deferred 的影响力提出了CommonJS 之Promises/A 规范①。同年,Node.js 首次亮相。Node 早期的几个版本在其非阻塞式API 中用到了Promise。但到了2010 年2 月,Ryan Dahl 决定切换至当时为人所熟知的callback(err, result…)格式,因为Promise 是一种属于“用户之境”的甚高层构造

–《javascript异步编程》

@magicdawn 你从哪看的,以后少看这些不准确的文献

蛤蛤,和楼主一摸一样啊,特别赞同最后一条,每次都会花很长时间去比较几个包的质量

@jingsam 我只说说这种病态,必然不会以star来看结果。哈哈

node社区花了10%的力气普及平台,花了90%的时间来anti-callback …

现在让我写一个多次IO往返的程序,我坚决用Python。

回到顶部