0

我想获取一个 URI,对其进行解析,然后根据解析的数据获取另一个 URI。使用 restler,我想我可以从第一个 get 调用的 .on('complete',...) 函数进行解析和第二个 get 调用。它似乎不像我预期的那样工作。为了调查,我编写了以下代码,这是我的代码结构的一个非常简化的版本。在我按下 Ctrl-C 之前它永远不会退出。

var sys = require('util');
var rest = require('restler');

function UriCall( uri, handler ) {
    rest.get(uri).on('complete', function(result) {
        if (result instanceof Error) {
            sys.puts('Error: ' + result.message);
        }
        else {
            if (handler) { handler( result ); }
            else { sys.puts('No handler provided.'); }
        }
    });
} 

var uri = "http://www.google.com";

UriCall(uri, function(result) {
   sys.print("@");
   UriCall(uri, function(result) {
      sys.print(".");
   });
});

输出:

$node resttest.js

@@.@..@...@....@.....@......@.......@........@ [deleted error messages] .........@..........@...........@............@.............@..............@...............@................@.................@..................@...................@....................@.....................@......................@.......................@........................@.........................@..........................@...........................@............................@.............................@..............................@...............................@................................@.................................@..................................@...................................  ^C

从上面的输出来看,每次调用都会有一些东西堆积起来,而且越来越深。我是一个刚刚开始使用 js/node/restler 的 C/C++ 人。为什么程序不简单地调用两次 UriCall 然后退出?

(顺便说一句:错误消息以“(节点)警告:可能的 EventEmitter 内存泄漏检测到添加了 11 个侦听器。使用emitter.setMaxListeners() 增加限制。”然后包含一些跟踪。错误消息并不让我感到惊讶似乎正在发生。)

4

1 回答 1

1

当您将事件侦听器附加到'complete'事件时,它们不会在事件发生后消失(当'complete'检测到任何事件时,它们将使用您最初输入的相同回调方法再次运行)。每次成功调用你的 uri 都会触发这个事件。因此,您基本上是在'complete'事件上堆叠函数调用,并且每次触发原始事件时,第一个回调中的递归调用都会增加更多。那有意义吗?

我建议使用.once而不是.on,正如这里所建议的(node.js restler call 上的多个响应)。或者在成功时解除绑定事件。

于 2013-09-06T17:20:06.730 回答