Readline передал обратный вызов для.закрыть порядок выполнения

#javascript #node.js #callback #asynchronous-javascript

#javascript #node.js #обратный вызов #асинхронный-javascript

Вопрос:

Здесь я использую модуль Readline внутри функции, которая выполняет функцию обратного вызова в.close. Он выполняется в ожидаемом порядке (код на.close, затем код в обратном вызове, переданный ему, это можно увидеть с помощью консоли.операторы журнала), однако копируется только часть конечного массива (как если бы часть кода не завершила выполнение вовремя).

Пример вывода:

 First: First Thing, 1, Second Thing, 2, Third Thing 3
Second: First Thing, 1
 

Как я могу получить эту строку кода:

 console.log("Second: "   result);
 

выполнять как с копированием всего массива (не перемещая все это в одну функцию или используя async / await)?

 ////////// Required Packages and Initialization //////////
var express = require("express");
var fs = require("fs");
var readline = require("readline");
var app = express();

app.use(express.static(__dirname   '/some_folder'));

app.listen(3000);

////////// Request Handler //////////
app.get("/some_request", function(req, res) {
    req.setTimeout(20000);
    input_data = ["First thing", "Second thing", "Third thing"]; // Already in alphabetical order
    file_search(input_data, "a_file.csv", function(output_data) {
        res.json(output_data);
    });
});

////////// Functions //////////
function file_search(name_array, FileName, callback)
{
    csv_fetch_array(name_array, FileName, function(result) {
        console.log("Second: "   result);  // Executes second as expected, but does not contain whole result array, cut short <-----
        callback(result);
    });
}

function csv_fetch_array(name_array, FileName, callback)
{
    var cntr = 0;
    var result = [];
    var len = name_array.length;

    if (!(FileName))
    {
        callback(result);
    }

    var file_stream = fs.createReadStream(__dirname   '/some_folder/'   FileName);

    file_stream.on('error', function (err) {
        callback(result);
    });

    var csv_file = readline.createInterface({
        input: file_stream
    });

    // csv file arranged in alphabetical order
    csv_file.on('line', function (line) {
        var search = line.split(",");
        var name_search = search[0];

        ///// Logic to hop to next phrase if past current one alphabetically /////
        if (name_search == name_array[cntr])
        {
            result.push(search);
            if (  cntr >= len)
            {
                csv_file.close();
                csv_file.removeAllListeners(); // Otherwise readline continues to empty buffer
            }
        }
        else if (name_search > name_array[cntr])
        {
            if (  cntr >= len)
            {
                csv_file.close();
                csv_file.removeAllListeners();
            }
            else if(name_search == name_array[cntr])
            {
                result.push(search);
                if (  cntr >= len)
                {
                    csv_file.close();
                    csv_file.removeAllListeners();
                }
            }
        }
    });

    csv_file.on('close', function() {
        console.log("First: "   result); // Correct result here, executes first <-----
        callback(result);
    });
}
 

Комментарии:

1. Я не думаю, что вы хотите делать cntr при пропуске строк

2. Вы правы, это должно было быть cntr, случайно изменил это при создании более короткой версии кода

3. На самом деле я имел cntr в виду, что вы вообще не должны увеличивать значение в name_search > name_array[cntr] случае, когда вы не вводите значение result . Но, возможно, я просто не понял ваш алгоритм.

4. Вам нужно увеличить значение до следующего элемента поиска в случае, если строка в CSV-файле находится в алфавитном порядке после текущего элемента поиска (затем попробуйте посмотреть, совпадает ли следующий элемент поиска с этой строкой, прежде чем переходить к следующей строке в CSV-файле, что в противном случае привело бы к пропускувозможное совпадение)