如何在节点js中维护事件循环中的持久数据?

时间:2014-12-29 01:34:27

标签: javascript node.js asynchronous javascript-events

我正在尝试将从数据事件接收到的字符串字符存储到k,但似乎k仅在.on函数中持久存在而不在函数外面

var http = require('http');

var url = process.argv[2];


http.get(url, function(res){
    k = [];
    res.on('data', function(data){

        //console.log(data.toString());
        k.push(data.toString());
        console.log(k);   // k stores a list string when .on is called
    });
    console.log(k);  // k is empty

});

我无法理解这种行为以及如何修复它,任何帮助都会受到赞赏

由于

3 个答案:

答案 0 :(得分:1)

问题是时间问题,而不是范围问题。最后的console.log语句在连接事件监听器之后立即运行,该监听器在监听器功能运行之前。您需要在k事件的监听器中对完整数组end执行任何操作:

res.on('end', function(){
    console.log(k);
});

答案 1 :(得分:1)

如果没有var语句,你会泄漏到global.k,但是变量范围不是你的问题。你的问题是时间。在任何数据进入之前,您的console.log(k); // k is empty正在运行,因此它当然是空的。你只需要等到你拥有所有数据并且res发出结束事件。

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

http.get(url, function(res){
    var k = [];
    res.on('data', function(data){
        k.push(data.toString());
        console.log(k);   // k stores a list string when .on is called
    });
    res.on('end', function() {
      console.log(k);  // k is full :)
    });
});

答案 2 :(得分:0)

  1. 在声明k:

    时尝试输入 var
    http.get(url, function(res){
      var k = []; // intialize k  with var.
      res.on('data', function(data){
         //console.log(data.toString());
         k.push(data.toString());
         console.log(k);   // k stores a list string when .on is called
      });
    console.log(k);  // k is empty
    });
    
  2. 尝试将k声明为全局变量。

    var http = require('http');
    var url = process.argv[2];
    var k = []; // initialize k here.
    
    http.get(url, function(res){
      res.on('data', function(data){
       //console.log(data.toString());
       k.push(data.toString());
       console.log(k);   // k stores a list string when .on is called
       });
      console.log(k);  // k is empty
    });