0

我让我的Request对象将各个 HTTP 请求排队,并使用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_);
            });
        });
    }
}

我的另一个问题是这是否是减慢 HTTP 请求的好方法?我正在尝试做的是......我对线程列表(大约 15-20)发出 HTTP 请求,然后对于每个线程,我发出另一个请求以获取其回复。有时在回复中,我必须再次请求深度嵌套的回复。我最初的解决方案是简单地调用http.get每个请求,但我发现我node.js在几个请求后停止响应,我必须不断重新启动服务器并刷新页面。我的想法是我可能一次发送了太多请求,所以我尝试实现这个队列。

4

1 回答 1

2

this内部的事件处理程序不正确,因此您的this.processRequest_is 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_()
                });
            });
        });
    }
}

也就是说,您可以考虑使用request 模块来简化它。

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 回答