我正在通过转换现有的Rails项目来学习Node.js.花了一些时间来了解回调和Node的异步性质。
第一次普遍尝试看起来没问题,我的RoR功能被复制,使用Node的速度要快得多。
Having watched the nodecast here我开始想知道我的创作是否违反了所有Node主体。
我有一些功能,根据结果调用其他功能。简单,if,else if else else。
我想弄清楚的是,这样做是否合适,或者我是否应该使用像async package这样的东西。
一个特定功能如下:
checkAuthorization: function(socket,callback) {
client.hget(socket.mac, 'authorized', function(err, val) {
callback(val);
if (val == null) {
checkExteralAuth(socket.mac, socket.serial, function(val) {
data = JSON.parse(val)
authorized = (data["live"] == 'yep') ? true : false
setRedisHash(socket.mac, 'authorized', authorized);
});
};
});
}
是否有模式“节点”方式?
答案 0 :(得分:2)
为什么不呢? Node.js是一个JavaScript平台。在函数式编程语言中调用函数内部函数是完全可以接受的。你一直这样做。
也就是说,有时你可能想避免简单地调用函数,特别是回调函数。您调用函数的方式由callback
引用,意味着除非该函数明确绑定到某个上下文(使用bind
),否则您将丢失上下文。
相反,callback.apply(this, [val]);
可能是开展业务的首选方式。
另一件事是,由于您要传递一个稍后要调用的回调函数,您可能需要认真考虑尽可能多地使用异步。我对node.js没有太多的经验,但就其本质而言,你会发现自己编写回调,处理程序,并且只是在整个地方使用一般的异步技巧。
拥有一个让这项工作变得更轻松的包装总是很方便......
答案 1 :(得分:1)
在这段代码中没有任何根本上是un-node-ish的东西,你会看到的大多数库都是这样编写的。
然而,当你正在处理一个相当快速增长的应用程序时,你最终会遇到所谓的“回调地狱”,其中嵌套级别达到一个级别,你可以拥有几十个嵌套的匿名函数调用。
这很快变得无法维护,这就是控制流库的用武之地。最受欢迎的几个是async
和q
。
async
可以轻松放入任何代码库来管理回调地狱,q
需要设计代码以作为Promises工作,但结果通常更好的API。