我想获取一个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()增加限制。”然后包含一些跟踪。鉴于似乎正在发生的事情,错误消息并不让我感到惊讶。)
答案 0 :(得分:1)
当您将事件监听器附加到'complete'
事件时,它们不会在事件发生后消失(它们将使用您在'complete'
任何'complete'
时最初放入的相同回调方法再次运行检测)。每次成功拨打您的uri都会触发此事件。因此,您基本上在.once
事件上堆叠函数调用,并且每次触发原始事件时,第一个回调中的递归调用会增加更多。这有意义吗?
我建议使用.on
代替{{1}},如此处所建议的那样(Multiple responses on node.js restler call)。或者在成功时将事件解除绑定。