Javascript 将变量传递给nodejs函数

Javascript 将变量传递给nodejs函数,javascript,arrays,node.js,get,Javascript,Arrays,Node.js,Get,我有一个简单的nodejs函数,它的工作原理如下: 向URL列表发出GET请求 正在收集对数组的所有响应 逐行打印回复 问题是,我在函数开始时初始化了results数组,在函数中间我将响应字符串推送到这个数组,但在最后这个数组是空的 var http = require('http'); var bl = require('bl'); var argv = process.argv; var results = []; for (i = 2; i < argv.length; i

我有一个简单的nodejs函数,它的工作原理如下:

  • 向URL列表发出GET请求
  • 正在收集对数组的所有响应
  • 逐行打印回复
  • 问题是,我在函数开始时初始化了results数组,在函数中间我将响应字符串推送到这个数组,但在最后这个数组是空的

    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);
    
    var http=require('http');
    var bl=需要('bl');
    var argv=process.argv;
    var结果=[];
    对于(i=2;i

    所以响应只是“[]”

    正如注释中指出的,http.get是异步工作的。因此,您必须处理它的事件来填充数组,并等待所有事件完成后打印出结果

    您可以以此为例(不使用bl):

    var http=require('http');
    var argv=process.argv;
    var结果=[];
    对于(i=2;i

    希望有帮助。

    这里http.get正在异步工作。所以试试看

    var http=require('http');
    var bl=需要('bl');
    var argv=process.argv;
    var延期=要求(“承诺”)。延期;
    var deferred=deferred();
    var结果=[];
    对于(i=2;i

    这对我很有用。

    谢谢你们的回复,他们都在工作,但我发现答案是“bl”

    var http=require('http');
    var bl=需要('bl');
    var argv=process.argv;
    var结果=[]
    函数printResults(){
    对于(变量i=2;i
    http.get的可能副本正在异步工作。您在收到结果之前就记录了结果。但我收集的是所有响应,但顺序是随机的,不是吗?
    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
    
            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
           });
    
    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()
                }
            }))
        })
    }