#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-файле, что в противном случае привело бы к пропускувозможное совпадение)