0

オブジェクトを個々の HTTP リクエストのキューに入れ、Request.NET を使用して 1 つずつ処理しましたprocess.nextTick。ただし、解決方法がわからないというエラーが表示されます。

node.js:244
        callback();
        ^
TypeError: undefined is not a function
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)

何が間違っているのかわかりません。該当クラスはこちら。

var Request = function() {
    return this;
};

Request.prototype = {
    queue_: []
};

Request.prototype.send = function(url, done) {
    this.queue_.push(new QueueableRequest(url, done));
    this.processRequest_();
}

Request.prototype.processRequest_ = function() {
    if (this.queue_.length > 0) {
        var request = this.queue_.shift();
        var data = '';
        http.get(request.url_, function(res) {
            res.setEncoding('utf8');
            res.on('data', function(chunk) {
                data += chunk;
            }).on('end', function() {
                request.callback_(null, JSON.parse(data));
                process.nextTick(this.processRequest_);
            }).on('error', function(err) {
                request.callback_(err, null);
                process.nextTick(this.processRequest_);
            });
        });
    }
}

もう 1 つの質問は、これが HTTP 要求を遅くする良い方法であるかどうかです。私がやろうとしているのはこれです...スレッドのリスト(約15〜20)のHTTPリクエストを作成し、スレッドごとに別のリクエストを作成して応答を取得します。返信内で、深くネストされた返信に対して別のリクエストを行う必要がある場合があります。私の最初の解決策はhttp.get、すべてのリクエストに対して単純に呼び出すことでしたがnode.js、いくつかのリクエストの後に応答が停止し、サーバーを再起動してページを更新し続ける必要があることがわかりました。一度に送信するリクエストが多すぎるのではないかと考えたので、このキューを実装しようとしました。

4

1 に答える 1

2

あなたthisのイベントハンドラの内部が間違っているのでthis.processRequest_undefined.

Request.prototype.processRequest_ = function() {
    // Assign the outer request object to a variable so you can access it.
    var self = this;

    if (this.queue_.length > 0) {
        var request = this.queue_.shift();
        var data = '';
        http.get(request.url_, function(res) {
            res.setEncoding('utf8');
            res.on('data', function(chunk) {
                data += chunk;
            }).on('end', function() {
                request.callback_(null, JSON.parse(data));
                process.nextTick(function(){
                    // Call 'processRequest_' on the correct object.
                    self.processRequest_()
                });
            }).on('error', function(err) {
                request.callback_(err, null);
                process.nextTick(function(){
                    // Call 'processRequest_' on the correct object.
                    self.processRequest_()
                });
            });
        });
    }
}

そうは言っても、リクエストモジュールを使用してこれを簡素化することを検討してください。

var request = require('request');

Request.prototype.processRequest_ = function() {
    var self = this;
    if (this.queue_.length > 0) {
        var requestData = this.queue_.shift();
        request(requestData.url_, function(error, response, body){
            requestData.callback_(err, err ? null : JSON.parse(body));
            process.nextTick(function(){
                self.processRequest_();
            });
        });
    }
};
于 2013-04-12T05:04:32.193 に答える