Javascript Nodejs读线回调

Javascript Nodejs读线回调,javascript,node.js,Javascript,Node.js,我正在研究回调,由于某些原因,我无法正确地得到它。。。 我想读取一个文件,并将其数据保存到一个全局变量中,以便以后使用 以下是我到目前为止的情况: var fs = require("fs"); var readline = require("readline"); var i = 0; var total = 66; //put the total foldernames or total images (same number) var folder_names = []; var data

我正在研究回调,由于某些原因,我无法正确地得到它。。。 我想读取一个文件,并将其数据保存到一个全局变量中,以便以后使用

以下是我到目前为止的情况:

var fs = require("fs");
var readline = require("readline");
var i = 0;
var total = 66; //put the total foldernames or total images (same number)
var folder_names = [];
var data = [];

lineReader = readline.createInterface({
    input: fs.createReadStream("folder-names and data.txt")
});


lineReader.on('line', function(line, dataCollector) {
    if(i<66)
        folder_names.push(line);
    else
        data.push(line);

    dataCollector(folder_names, data);
    i++;
});

var dataCollector = function(folder_names, data) {
    //console.log(folder_names);
}

console.log(folder_names[0]); //should have a value now.
var fs=require(“fs”);
var readline=需要(“readline”);
var i=0;
var总计=66//放入总文件夹名或总图像(相同数字)
var文件夹_名称=[];
var数据=[];
lineReader=readline.createInterface({
输入:fs.createReadStream(“文件夹名称和数据.txt”)
});
lineReader.on('line',函数(line,dataCollector){

如果(i您在此处跟踪
数据采集器
标识符:

lineReader.on('line', function(line, dataCollector) {
它将
dataCollector
声明为回调的第二个参数,在脚本的顶层隐藏标识符

不会记录它为其回调提供了第二个参数,因此它应该如下所示:

lineReader.on('line', function(line) {

请回答你的问题:

不,不应该。为什么:

在您的情况下,您可能希望在
close
事件处理程序中执行
console.log

lineReader
    .on('line', function(line) {
        if(i<66)
            folder_names.push(line);
        else
            data.push(line);

        dataCollector(folder_names, data);
        i++;
    })
    .on('close', function() {
        console.log(folder_names[0]); // has its values now
    });
lineReader
.on('line',函数(line){

如果(i您使用
var
声明您的函数,这将在到达该行时执行。因此,当您在回调中调用它时,该函数尚未定义。为了能够使用它,请将其移动到
lineReader之前。在('line',function(){})
上,或者(更好)这样定义它:

function dataCollector(folder_names, data) {
  /* Your function */
}

这样做,您的函数将在脚本执行之前声明,因此在您到达回调时它就存在了。

我想在lineReader函数中填入folder\u names变量。我将更新我的问题。@FlorinPop:您当前的问题是关于为什么会出现错误“dataCollector不是函数”。问题并不意味着是移动目标。这回答了这个问题。我在描述中告诉了我想要的:“我想读取一个文件,并将其数据保存到一个全局变量中,以便以后使用。”@FlorinPop:重点是错误消息。我在上面添加了一个关于编辑的注释。重点不是错误消息。我正在努力获取错误消息在lineReader函数外调用变量,以便我以后可以对其进行操作。但谢谢!“您使用var声明函数,这将在到达该行时完成。因此,当您在回调中调用它时,该函数尚未定义。”不,这是不正确的,但是你可以理解为什么你会到达那里。只有当
readLine
同步调用它的回调时才会出现这种情况,但是它没有。按照问题中的顺序排列东西是不好的做法,但是
dataCollector
在调用回调时会有它的值。是的:请参阅函数声明被引入。尽管如此,这里的问题仍然是所指出的阴影。是的,我知道函数声明是如何工作的。我是说你所说的OP代码是不正确的。因为它是不正确的。我也非常清楚地说了为什么它是不正确的。对不起,误读了你的帖子。我同意你的观点:).但正如您所指出的,我的观点是,我认为函数的声明顺序不正确(但我可能错了)。它不理想,但也不正确,而且确实有效;函数是在OP调用它时定义的:(它不适用于
数组#sort
使用的同步回调。)OP的实际问题与此完全无关。
function dataCollector(folder_names, data) {
  /* Your function */
}