从函数调用函数是否可以接受Node.js?

时间:2013-06-27 10:56:18

标签: javascript node.js

我正在通过转换现有的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);
        });
      };
    });
  }

是否有模式“节点”方式?

2 个答案:

答案 0 :(得分:2)

为什么不呢? Node.js是一个JavaScript平台。在函数式编程语言中调用函数内部函数是完全可以接受的。你一直这样做。

也就是说,有时你可能想避免简单地调用函数,特别是回调函数。您调用函数的方式由callback引用,意味着除非该函数明确绑定到某个上下文(使用bind),否则您将丢失上下文。

相反,callback.apply(this, [val]);可能是开展业务的首选方式。

另一件事是,由于您要传递一个稍后要调用的回调函数,您可能需要认真考虑尽可能多地使用异步。我对node.js没有太多的经验,但就其本质而言,你会发现自己编写回调,处理程序,并且只是在整个地方使用一般的异步技巧。

拥有一个让这项工作变得更轻松的包装总是很方便......

答案 1 :(得分:1)

在这段代码中没有任何根本上是un-node-ish的东西,你会看到的大多数库都是这样编写的。

然而,当你正在处理一个相当快速增长的应用程序时,你最终会遇到所谓的“回调地狱”,其中嵌套级别达到一个级别,你可以拥有几十个嵌套的匿名函数调用。

这很快变得无法维护,这就是控制流库的用武之地。最受欢迎的几个是asyncq

async可以轻松放入任何代码库来管理回调地狱,q需要设计代码以作为Promises工作,但结果通常更好的API。