使用Node.js执行同步获取请求

我试图得到从服务器收到的响应相同的顺序,那里的url作为命令行parameter passing。但它不执行同步操作,请帮助。 我相对较新的JavaScript和节点。 请在下面find我的代码:

var http = require('http'); var bl = require('bl'); var fs = require('fs'); var q = []; var count = 0; q[0] = getRequest(process.argv[2]); q[1] = getRequest(process.argv[3]); q[2] = getRequest(process.argv[4]); function getRequest(url) { var val; http.get(url,function (res) { res.on('end', function () { count++; }), res.pipe(bl(function (error, data) { val = data.toString(); if (error) { console.log(error); } else { console.log(val); } })) }).on('error', function (e) { console.log("Got error: " + e.message); }); return val; } if (count == 3) { for (var i = 0; i < q.length; i++) { console.log[q[i]]; } } 

 var http = require('http'); var bl = require('bl'); // data should return via callback = function(err, data) function getRequest(url, callback) { http.get(url, function(res) { res.pipe(bl(function(error, data) { callback(error, data); })) }).on('error', function(e) { callback(error); }); } // npm install async var async = require('async'); async.map(process.argv.slice(2), getRequest, function (err, data_array) { data_array.forEach( function (data, i) { console.log(i, data.toString('utf8')); }); }) 

保存为test.js并从terminal运行:

 npm install bl npm install async node test.js http://api.openkeyval.org/hello1 http://api.openkeyval.org/hello2 

输出:

 0 'hello one' 1 'hello two' 

async.map会像这样调用getRequest:

 getRequest(url1, function (e, data) { console.log(data); getRequest(url2, function (e, data) { console.log(data); getRequest(url3, function (e, data) { console.log(data); }) }); }); 

既然是asynchronous返回将不会有用。 但是当你有结果时,你可以推它。

  res.pipe(bl(function (error, data) { val = data.toString(); q.push(val); if (error) { ... 

或者如果你想使用计数,你可以这样做:

  res.pipe(bl(function (error, data) { val = data.toString(); q[count] = val; if (error) { ... 

那么你可以简单地调用:

 getRequest(process.argv[2]); getRequest(process.argv[3]); getRequest(process.argv[4]); 

另一种方法,不使用任何插件或附加的asynchronous实现:

 var http = require('http') var bl = require('bl') var results = [] var count = 0 function printResults () { for (var i = 0; i < 3; i++) console.log(results[i]) } function httpGet (index) { http.get(process.argv[2 + index], function (response) { response.pipe(bl(function (err, data) { if (err) return console.error(data) results[index] = data.toString() count++ if (count == 3) // yay! we are the last one! printResults() })) }) } for (var i = 0; i < 3; i++) httpGet(i) 

或者没有任何附件或插件

 var http = require('http') //var bl = require('bl') // if you want to use bl var url1 = process.argv[2] var url2 = process.argv[3] var url3 = process.argv[4] // data should return via callback = function(err, data) function getRequest(url, callback) { http.get(url, function(response) { response.setEncoding('utf8') response.on('error', function(e) { callback(error); }) var allData = '' response.on('data', function(data) { allData += data }) response.on('end', function() { callback(null, allData) }) // Would be the result using bl /* response.pipe(bl(function(err, data) { callback(err, data.toString()) })) */ }) } // This can be placed in a for loop getRequest(url1, function (e, data) { console.log(data) getRequest(url2, function (e, data) { console.log(data) getRequest(url3, function (e, data) { console.log(data) }) }) }) 

所以你第一次尝试就没那么远了!