我正在研究回调,由于某种原因,我无法做到正确... 我想读取一个文件,并将其数据保存到全局变量中以便稍后播放。
这是我到目前为止所做的:
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
答案 0 :(得分:4)
您在此处隐藏了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.log
事件处理程序中执行close
:
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
});
答案 1 :(得分:0)
您使用var
声明您的功能,这将在到达线路时完成。因此,当您在回调中调用它时,该函数尚未定义。为了能够使用它,要么在lineReader.on('line', function(){})
之前移动它,要么(更好)定义它:
function dataCollector(folder_names, data) {
/* Your function */
}
这样做,您的函数在脚本执行之前声明,因此当您到达回调时它就存在。