2015-02-09 63 views
-1

我有简单的功能的NodeJS应该工作如下:传递变量函数的NodeJS

  1. 使GET请求列出的URL。
  2. 收集对数组的所有响应。
  3. 逐行打印回复。

问题是我在开始和在功能我推响应字符串这个数组中初始化结果阵列,但在最终这数组为空。

var http = require('http'); 
var bl = require('bl'); 
var argv = process.argv; 
var results = []; 

    for (i = 2; i < argv.length; i++) { 
    var url = argv[i].toString(); 
    http.get(url, function (response) { 
     response.pipe(bl(function (err, data) { 
      results.push(data.toString()); //if im just printing the data it shows the correct info. 
     })) 
    }) 

} 
console.log(results); 

所以响应只是“[]”。

+0

可能重复[如何返回从Ajax调用的响应?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-呼叫) – 2015-02-09 13:31:44

+2

http.get异步工作。您在收到结果之前记录结果。 – 2015-02-09 13:32:02

+0

但我收集的所有回应,但随机顺序,不是吗? – Serghei 2015-02-09 13:36:36

回答

1

正如评论中指出的那样,http.get异步工作。因此,您必须使用其事件来填充阵列,并等到所有这些事件都完成后才打印出结果。

你可以把这个作为一个例子(不打算使用BL):

var http = require('http'); 
var argv = process.argv; 
var results = []; 

for (i = 2; i < argv.length; i++) { 
    var url = argv[i].toString(); 
    http.get(url, function (response) { 
     var res = ''; 
     response.setEncoding('utf8'); 

     response.on('data', function (data) {// Collect data. 
      res += data; 
     }); 

     response.on('end', function() {// Response's finished, print out array if we have collected all the requests. 
      results.push(res); 
      if (results.length === argv.length - 2) { 
       console.log(results); 
      } 
     }); 
     response.on('error', console.log); 
    }); 

} 
//console.log(results);// This is not correct as it'll print out an empty array due to the asynchrous nature of http.get 

希望它能帮助。

1

Here http.get异步工作。所以请尝试promise

 var http = require('http'); 
     var bl = require('bl'); 
     var argv = process.argv; 
     var defer = require("promise").defer; 
     var deferred = defer(); 
     var results = []; 

      for (i = 2; i < argv.length; i++) { 
      var url = argv[i].toString(); 
      http.get(url, function (response) { 
       response.pipe(bl(function (err, data) { 
        results.push(data.toString()); //if im just printing the data it shows the correct info. 

       })); 
       deferred.resolve("succesful result"); 
      }); 
     } 

     deferred.promise.then(function(result){ 
      console.log(results); 
     }, 
     function(error){ 
      //... executed when the promise fails 
     }); 

它适用于我。

0

谢谢大家的回应,他们正在工作,但我找到了答案与“BL”。

var http = require('http'); 
var bl = require('bl'); 
var argv = process.argv; 
var results = [] 

function printResults() { 
    for (var i = 2; i < argv.length; i++) 
     console.log(results[i]) 
} 


for (i = 2; i < argv.length; i++) { 
    var url = argv[i].toString(); 
    http.get(url, function (responce) { 
     responce.pipe(bl(function (err, data) { 
      results[i] = data.toString() 
      if (count == 3) { 
       printResults() 
      } 
     })) 
    }) 
}