在关闭事件时从 node.js readline 模块返回数组

Posted

技术标签:

【中文标题】在关闭事件时从 node.js readline 模块返回数组【英文标题】:Return array from node.js readline module on close event 【发布时间】:2019-03-25 15:54:00 【问题描述】:

我正在服务器端调用一个函数,该函数打开一个 csv 文件并在每一行中搜索一个字符串。在关闭事件中,该函数应返回一个数组,其中包含来自 csv 文件(在第一列中)的前 5 个字符串匹配项。但是,似乎在函数之外无法访问该数组(可能是由于异步行为):

index.js

function calling_function()

    var a_string = "foo";
    var array = database_search(a_string);
    console.log(array); 


function database_search(a_string)

    var result = ["", "", "", "", ""];

    var csv_file = readline.createInterface(
        input: fs.createReadStream(__dirname + '/Static/a_file.csv')
    );

    var cntr = 0;

    csv_file.on('line', function (line) 
        if(line.indexOf(a_string) > -1)
        
            if(cntr < 5)
            
                result[cntr] = line.split(",")[0];
            
            else
            
                csv_file.close();
            
            cntr++;
        
    );

    csv_file.on('close', function() 
        return result; // not returning result array
    );

在关闭事件时访问 readline 之外的数组的正确方法是什么?

【问题讨论】:

【参考方案1】:

在“csv_file.on”事件中,您处于回调函数的范围内。 为了获取数组,您可以执行以下操作:

function calling_function()

    var a_string = "foo";
    var array = []
    database_search(a_string ,arr => 
        array = arr 
        console.log(array);
    );


function database_search(a_string ,callback)

    var result = ["", "", "", "", ""];

    var csv_file = readline.createInterface(
        input: fs.createReadStream(__dirname + '/Static/a_file.csv')
    );

    var cntr = 0;

    csv_file.on('line', function (line) 
        if(line.indexOf(a_string) > -1)
        
            if(cntr < 5)
            
                result[cntr] = line.split(",")[0];
            
            else
            
                csv_file.close();
            
            cntr++;
        
    );

    // notice i added the 'result' in the callback function parameter
    csv_file.on('close', function(result) 
        callback(result)
    );

【讨论】:

它似乎仍然返回 undefined 尝试记录结果 csv_file.on('close', function(result) console.log(result) callback(result) );看看它是否按预期返回结果。 好的,只需对您的答案稍作调整即可使用它:) 只需在 readline 关闭匿名回调函数中将“result”作为参数传递(因为它创建了一个新变量“结果”而不是使用包含数组的原始“结果”): csv_file.on('close', function() callback(result) );

以上是关于在关闭事件时从 node.js readline 模块返回数组的主要内容,如果未能解决你的问题,请参考以下文章

Node.js Cluster Worker:关闭事件

Node.js实现终端输入(readline模块)

Node.js承诺中的readline

我们如何在(Node.js 8. 目前)上的 readline.on 函数下使用 promise

从 socket.io 收到消息时从客户端播放音频 - node.js

在回调函数之外访问由 node.js 中的 readline 和 fs 解析的数据