在nodejs中使用promise和orm
发布于 5个月前 作者 klamtlne 2179 次浏览 来自 问答

前阵子做的项目中,字段比较多,初学node代码写的很混乱,最终成了酱紫:

屏幕快照 2014-09-25 上午12.25.39.png

现在准备重构这个项目,callback用promise替代,用orm替代手写sql语句,这里有两个问题:

  1. nodejs中大部分操作是回调式的,假设使用Q的话,是否要用 .defered() 方法在函数入口处promise化,然后继续逻辑处理?
  2. orm搜了一下,发现start最多的式 http://sequelizejs.com/,准备翻翻文档用起来,orm除了无需手写sql之外还有什么好处吗?目前有哪些开源项目使用了orm+promise?

tks

25 回复

promise 不懂,我喜欢用 eventproxy,用事件思想来解耦比较好懂。

promise库推荐bluebird,现在promise库大部分都支持对node格式的回调进行直接转换,不用再手动处理了,比如bluebird提供的Promise.promisify接口

@alsotang 你竟然不懂promise…… 我认为promise代码还是比eventproxy容易读,更符合人类思维方式

@ravenwang 我本身也蛮喜欢事件回调的

@ravenwang 看了这个系列文章:http://segmentfault.com/blog/kk_470661/1190000000586666 (链接后面的文字也会成文链接) 就先使用 Q 没有用 bluebird 了,不知道是智商不够还是和棒子思维不一样,很难入门 Q

@alsotang 我发现链接后面还有文字也会被转成链接,加一个\就行了,示例:http://cnodejs.org/topic/5422f46829fd004a6a13b91d,aabbccdd

@klamtlne 链接空一格就好了

使用bluebird吧,我也是最近重构自己的代码,换了bluebird

最近在写一个非常简陋的支持 memcached 绑定的 ORM,查询兼容 callback 和 promise 模式。

看到这么多回调吓鸟了, 还是感觉用Promise模块好

重构完成后,首页是酱紫的: 屏幕快照 2014-09-26 下午11.47.09.png

ListAll() 是定义在model中的方法,路由的逻辑被Controller层handle,简直酸爽

@klamtlne 楼主是用Q模块么?能不能给个demo我看看?

@alsotang 我想问一下howdo用过没有情况如何。

:-O 我好喜欢工工整整的代码。

@jeffreyluo 不是Q,是orm内置的,他们用的是bluebird。不过如果你catch到了promise的核心,其实都大同小异了。

@klamtlne 比如有两个方法,a和b,b中要用a返回的数据查询数据库,a().then(b)这样貌似做不到吧?

Q太重了 硬是要用promise的话 推荐when.js 不过你还可以试试 co,把node版本升级到0.12+

@jeffreyluo 看我前面给的链接

@alsotang 弄懂回调才是根本,在这个基础上,async eventproxy promise 自然就都明白了。有些人本末倒置了,还要来惊诧一下。

弄不明白回调的,上面的库再华丽,也是纸糊的。因为库不可能帮人解决所有问题,如果这个库有解决所有问题的愿望,就会变得很复杂很庞大,那就陷入了另一个无法理解的境地。所以我认为弄懂根本才是正途。

我也很喜欢回调,所以我喜欢async。

@coordcn 把问题无限拔高再来批判,提升逼格,没谁说promise解决了所有问题,而且你凭什么就假设别人就不懂回调?无聊

用yield处理回调呀,tj大神的co很好用的,node v0.11版本 支持 es6 的yield,再用koajs就好极了,哈哈,另外我自己是觉得没必要非要搞个orm,自己写个sql模板,把sql和js代码分离出来,用的时候用参数填充下sql模板,又轻量又简洁。

@chemdemo 推荐when.js,快而且小,基本够用。

@yeaha 没必要扣这么大的帽子,如果你认为我的语言让你不舒服了,还请见谅。

你仔细读下我的文字,我的意思是用各种库之前要真正理解了回调本身,我并没有针对个别人。如果说要针对,仅仅对那个惊诧的人而已,我也只是说了本末倒置,并未假设他就不懂回调。

谁都是从这个过程过来的,或者说是大部分接触异步IO回调都会面临这样的问题, eventproxy 和 async 都是不错的解决方案.

回到顶部