Nodejs readline回调

时间:2016-09-30 11:35:19

标签: 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 = [];

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

2 个答案:

答案 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 */
}

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