Возвращает массив из модуля readline для node.js при закрытии - PullRequest
0 голосов
/ 21 октября 2018

Я вызываю функцию на стороне сервера, которая открывает CSV-файл и ищет строку в каждой строке.В случае события close функция должна вернуть массив, содержащий первые 5 совпадений строк из файла csv (в первом столбце).Однако, кажется, что массив недоступен вне функции (возможно, из-за асинхронного поведения):

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 Ответ

0 голосов
/ 21 октября 2018

В событии "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)
});
}
...