restler调用中的意外递归(node / js)

时间:2013-09-06 15:53:16

标签: javascript node.js restler

我想获取一个URI,解析它,然后根据解析的数据获取另一个URI。使用restler,我以为我可以从第一个get调用的.on('complete',...)函数进行解析和第二次调用。它似乎没有像我期望的那样工作。为了调查,我编写了以下内容,这是我的代码结构的一个非常简化的版本。在我按下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()增加限制。”然后包含一些跟踪。鉴于似乎正在发生的事情,错误消息并不让我感到惊讶。)

1 个答案:

答案 0 :(得分:1)

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

我建议使用.on代替{{1}},如此处所建议的那样(Multiple responses on node.js restler call)。或者在成功时将事件解除绑定。