如何在 nodejs 中维护事件循环中的持久数据

How to maintain persistant data from event loop in nodejs?

本文关键字:数据 循环 维护 nodejs 事件      更新时间:2023-09-26

我正在尝试将从数据事件接收的字符串字符存储到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
});

我无法理解这种行为以及如何解决它,任何帮助将不胜感激。

如果没有 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 :)
    });
});

问题在于时机,而不是范围。 最终的 console.log 语句在挂接事件侦听器后立即运行,即在侦听器函数运行之前。 您需要在 end 事件的侦听器中对完整数组k执行任何工作:

res.on('end', function(){
    console.log(k);
});
  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
    });