0

我正在通过转换现有的 Rails 项目来学习 Node.js。我花了一些时间来理解回调和 Node.js 的异步特性。

第一次一般尝试看起来不错,我的 RoR 功能被复制了,使用 Node.js 的一般速度要快得多。

在这里观看了节点广播后,我开始怀疑我的创作是否违反了所有节点原则。

我有一些函数,根据结果调用其他函数。简单,if,else if,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);
        });
      };
    });
  }

有这样做的模式“节点”方式吗?

4

2 回答 2

2

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

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

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

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

拥有一个使这项工作变得更容易的软件包总是很方便......

于 2013-06-27T11:01:00.127 回答
1

这段代码中没有任何根本上非节点的东西,您将看到的大多数库都是这样编写的。

然而,当你在一个应用程序上工作时,它往往会增长得相当快,你最终会遇到所谓的“回调地狱”,其中嵌套级别达到了可以有数十个嵌套匿名函数调用的级别。

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

async可以很容易地放入任何代码库以管理回调地狱,q需要将您的代码架构为 Promises,但通常会产生更好的 API。

于 2013-06-27T11:07:16.423 回答