请教一个 Node.js 的代码组织问题

2014-05-06 08:55:40 +08:00
 Livid
对于 cache key A,如果在 redis ( https://www.npmjs.org/package/redis ) 中不存在,就通过 request ( https://www.npmjs.org/package/request ) 去某个 http 地址拿一个 json,然后如果这个 request 的 status_code 是 200 就将这个 JSON 以 cache key A 存入 redis。

如果 cache key A 存在,就取出来,通过 JSON.parse() 还原为对象。

然后代码继续,根据( 从 redis 里拿到的数据 或者 从 request 里拿到的数据 )执行下一步操作。

因为 Node.js 在 redis 和 request 这里都是异步 callback,我比较好奇像这样的情况在 Node.js 中最好的做法是?
5067 次点击
所在节点    Node.js
26 条回复
Livid
2014-05-06 08:59:18 +08:00
我也想 Google,但是这个自动联想好像哪里怪怪的…

jybox
2014-05-06 09:00:30 +08:00
getCache = (name, setter, callback) ->
memcached.get name, (err, result) ->
if result
callback result
else
setter (result) ->
memcached.set name, result, ->
callback result
jybox
2014-05-06 09:01:05 +08:00
ine181x
2014-05-06 09:05:31 +08:00
Xe0n0
2014-05-06 09:05:59 +08:00
refresh
2014-05-06 09:08:30 +08:00
async, Q, promise
vfasky
2014-05-06 09:08:48 +08:00
windjs 可以做到 python 的 yield http://windjs.org/cn/docs/async/method.html

但很多人不喜欢 eval, 其实 windjs 是可以像 coffee 一样预编译的。 但是 windc 一直没进度。

老赵可能放弃了。 可惜啊!

ECMAScript 6 看来短期不会成熟
mytharcher
2014-05-06 09:09:13 +08:00
用Promise,async queue,或者直接ES6的yeild
mytharcher
2014-05-06 09:10:53 +08:00
不好意思,拼错了,是yield
chone
2014-05-06 09:13:30 +08:00
Promise A+ 应该是最适用的。
Xe0n0
2014-05-06 09:14:58 +08:00
如果使用 Promise,结果应该类似

http.get(url).then(function(data){

if (A in data) return data[A];
else reject("key A not exists");

}).then(JSON.parse).then(function(object){
...
}).catch(function(error_code){
...
});

可以写成 chain 的形式,这里把可能的错误都 catch 了,如果不需要可以写得更短。
NemoAlex
2014-05-06 09:34:11 +08:00
没有什么好办法,用 callback 的形式就是这么憋屈,用 promise 好看一点,也没好到哪去
rannnn
2014-05-06 09:50:06 +08:00
我用 flow.js 完成后call this就会进行下一个function

flow.exec(
function() {
setTimeout(this, 200);

},function() {
setTimeout(this, 200);

},function() {
// done

}
);
est
2014-05-06 10:08:42 +08:00
最近学习到的 require('events').EventEmitter 姿势



http://blog.est.im/post/84684285685
WildCat
2014-05-06 10:21:36 +08:00
借贴提问,
Eventproxy, Async, Promise的用途是否类似?
lloydsheng
2014-05-06 10:34:21 +08:00
消除callback最流行的方法 https://www.npmjs.org/package/q
j
2014-05-06 10:37:18 +08:00
支持 @Xe0n0 的方法,
有个小建议是为了将来自己维护方便。还是给匿名函数起个合理的名字比较好。
luin
2014-05-06 10:39:57 +08:00
这种简单的逻辑最好直接用 @jybox 的方法,不要用 async, yield 甚至 windjs。Promise 也要视情况使用,否则反而会影响代码可读性。

另外 @jybox 的代码还可以优化的点是在 if 语句中使用 return 尽快退出条件判断,以免去 else 那层的嵌套。
aisk
2014-05-06 10:56:30 +08:00
chemzqm
2014-05-06 11:05:09 +08:00
@vfasky 作者感受到 co https://github.com/visionmedia/co 的强大之后不再开发了,这是我见过最优雅的异步实现方式,没有 node 0.11 可以使用 regenerator https://github.com/facebook/regenerator

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/111298

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX