0

URI を取得して解析し、解析したデータに基づいて別の URI を取得したいと考えています。restler を使用して、最初の get 呼び出しの .on('complete',...) 関数から解析と 2 番目の 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 を 2 回呼び出してから終了しないのはなぜですか?

(ところで:エラーメッセージは「(ノード)警告:EventEmitterメモリリークの可能性が検出されました。11個のリスナーが追加されました。エミッター.setMaxListeners()を使用して制限を増やしてください。」で始まり、いくつかのトレースが含まれています。エラーメッセージは何を考えても驚かない起きているようです。)

4

1 に答える 1

1

イベント リスナーをイベントにアタッチすると'complete'、イベントが発生した後もそれらは消えません (何か'complete'が検出されると、最初に設定したのと同じコールバック メソッドで再度実行されます)。uri への呼び出しが成功するたびに、このイベントがトリガーされます。したがって、基本的にイベントで関数呼び出しを積み重ねて'complete'おり、最初のコールバックの再帰呼び出しは、元のイベントがトリガーされるたびにさらに追加されます。それは理にかなっていますか?

.onceここで提案されているように、代わりにを使用することをお勧め.onします ( node.js restler call に対する複数の応答)。または、成功時にイベントのバインドを解除します。

于 2013-09-06T17:20:06.730 に答える