2016-09-30 72 views
0

我正在研究回调函数,出于某种原因,我无法正确处理它... 我想读取一个文件,并将其保存到一个全局变量中以供稍后使用。Nodejs readline回调

这是我到目前为止有:

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. 

有什么不对?我得到:dataCollector is not a function

回答

3

你们在阴影中dataCollector标识符:

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

声明dataCollector作为第二个参数到您的回调,遮蔽(隐藏)在脚本的顶层标识符。

The line event不会记录其回调的任何第二个参数,所以它应该是这样的:

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

重新您的问题延伸:

console.log(folder_names[0]); //should have a value now. 

不,不应该。为什么:How do I return the response from an asynchronous call?

在你的情况,你可能想要做你的console.logclose事件处理程序:

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 
    }); 
+0

我想获得填充到lineReader函数中的folder_names变量。我会更新我的问题。 –

+0

@FlorinPop:你的问题目前是关于你为什么得到错误*“dataCollector不是函数”*。问题并不意味着成为移动目标。这回答了这个问题。 –

+0

我在描述中告诉我想要什么:'我想读取一个文件,并将它的数据保存到全局变量中以便稍后播放。 –

0

的声明使用var达到线时会做你的函数。所以当你在你的回调中调用它时,这个函数还没有被定义。为了能够使用它,无论是lineReader.on('line', function(){})或(更好)之前将它定义它这样的:

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

这样做,这样,执行你的脚本之前,你的函数声明,因此当你达到它的存在你的回调。

+0

*“你使用var来声明你的函数,这个函数在到达这条线时会被完成,所以当你在回调函数中调用它的时候,函数还没有被定义。”*不,这是不正确的,但是为什么你会得到它是可以理解的那里。这只会是如果'readLine'同步调用它的回调*,但它不会。按照问题中的顺序放置事物是一种不好的做法,但在调用回调时,dataCollector将具有它的值。 –

+0

最初是这样的:请参阅https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/function中的函数声明hoisting_。尽管如此,这个问题仍然是指出的阴影。 –

+0

***叹息***是的,我知道函数声明如何工作。我在说,你对OP的代码所说的话是不正确的。因为这是不正确的。我也很清楚地说*为什么*这是不正确的。 –