我想在我的服务器节点上启动异步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]
答案 0 :(得分: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);
});
答案 1 :(得分:1)
除了类型/类
之外,不要使用其他属性的大写名称下面是您的代码,修正了明显的错误
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);
});
答案 2 :(得分:0)
好的是用callback(null, res);
代替callback(res);
调用回调,我认为第一个参数被解释为错误而第二个参数是实际结果。