2015-02-09 82 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() 
      } 
     })) 
    }) 
}