5

我想在我的服务器节点上启动异步 http 调用,我看到了async节点模块,我想这async.parallel使我们能够做到这一点。

记录的示例非常清楚,但我不知道如何管理多个 http 调用。

我尝试了下面的示例,但它甚至没有启动 http 调用:

var http = require('http');

var Calls = [];
Calls.push(function(callback) {
    // First call
    http.get('http://127.0.0.1:3002/first' callback);
});

Calls.push(function(callback) {
    // Second call
     http.get('http://127.0.0.1:3002/second' callback);
});

var async = require('async');
async.parallel(Calls, function(err, results) {
    console.log('async callback: '+JSON.stringify(results));
    res.render('view', results);
});

如果我单独启动 http 请求,我确实有结果,但是调用异步回调我得到async callback: [null,null]

4

3 回答 3

5

看看文档

使用 http.request() 必须始终调用 req.end() 以表示您已完成请求 - 即使没有数据写入请求正文。

您正在创建一个请求,但您没有完成它。在您的通话中,您应该这样做:

var req = http.request(options, function(page) {
    // some code
});
req.end();

这是假设您正在执行没有正文的普通 GET 请求。

您还应该考虑使用http.get这是一个不错的快捷方式:

http.get("http://127.0.0.1:3002/first", function(res) {
    // do something with result
});

更新另一件事是异步回调必须采用以下形式

function(err, res) { ... }

你现在这样做的方式行不通,因为对 http.get 的回调只接受一个参数res。您需要执行以下操作:

http.get('http://127.0.0.1:3002/second', function(res) {
    callback(null, res);
});
于 2013-06-14T10:54:37.640 回答
0

好的,事情是以这种方式调用回调callback(null, res);callback(res);我认为第一个参数被解释为错误,第二个参数是真实结果。

于 2013-06-14T12:40:39.053 回答
0

不要将大写名称用于类型/类以外的其他目的

以下是您的代码,并纠正了明显的错误

var http = require('http');

var calls = [];
calls.push(function(callback) {
    // First call
    http.get('http://127.0.0.1:3002/first', function (resource) {
         resource.setEncoding('utf8');
         resource.on('data', function (data) {
             console.log('first received', data);
             callback();
         });
    });
});

calls.push(function(callback) {
    // Second call
    http.get('http://127.0.0.1:3002/second', function (resource) {
         resource.setEncoding('utf8');
         resource.on('data', function (data) {
             console.log('second received', data);
             callback();
         });
    });
});

var async = require('async');
async.parallel(calls, function(err, results) {
    console.log('async callback ', results);
    res.render('view', results);
});
于 2015-06-07T02:22:28.503 回答