【问题标题】:unexpected recursion in restler call (node/js)restler 调用中的意外递归(node/js)
【发布时间】:2013-09-06 15:53:15
【问题描述】:

我想获取一个 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() 来增加限制。” 然后包括一些跟踪。鉴于似乎正在发生的事情,错误消息并不让我感到惊讶。)

【问题讨论】:

    标签: javascript node.js restler


    【解决方案1】:

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

    我建议使用.once 而不是.on,正如这里所建议的那样 (Multiple responses on node.js restler call)。或者在成功时取消绑定事件。

    【讨论】:

    • 谢谢。使用 rest.get.once 就可以了。输出: @。那么,每次调用 rest.get.on 都会附加一个新的事件处理程序?我假设事件列表有一定的范围,通常事件处理程序不受限制,但在这里由于嵌套调用它永远没有机会?
    • @jbirkel。正确的。如果您希望它映射多次,但您可能会多次调用它,您可以将其命名为complete.UriCall 并在调用on 之前执行.off('complete.UriCall')。句号之前的都是事件名称,后面的只是为了以后区分。
    • 开/关——很高兴知道。我认为它是“onComplete”谢谢,Colin。
    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2016-01-20
    • 2017-07-11
    • 2018-01-04
    • 2013-09-08
    • 1970-01-01
    相关资源
    最近更新 更多