Javascript - как получить доступ к результату в событии закрытия readfile и вернуть его в исходную функцию - PullRequest
1 голос
/ 20 июня 2019

Я использую readline, чтобы построчно читать текстовый файл и обрабатывать его с некоторой фильтрацией.Текстовый файл содержит множество сокращений и соответствующее целое слово или предложение.Например, «КСТАТИ» означает «кстати».В построчном разделе readlines я делаю некоторую фильтрацию и помещаю нужные строки в массив.

Последний массив выглядит так, к которому я могу получить доступ успешно при событии 'close' и вывести данные по желанию.

var arr = [{wholeword: 'by the way',abbr: 'btw'}, {wholeword: 'увидимся', abr: 'cya'}, {wholeword: 'be be back', abbr: 'brb'}]

Я изо всех сил пытаюсь вернутьпривести к исходной позиции.Я не уверен, возможно ли и как это возможно, потому что readline использует это дополнительное событие, называемое 'close'.Нужно ли как-то работать с обратным вызовом?Никогда раньше не работал с ними, и мне нужно было бы покопаться в этом.Мне просто нужно несколько подсказок, где можно посмотреть, пожалуйста, пролите немного света на это.

const fs = require('fs');
const readline = require('readline');

function lookup(abbreviation) {
  var arr = [];
  const readFile = readline.createInterface({
   input: fs.createReadStream('abbreviations.txt'),
   crlfDelay: Infinity
  });

  readFile.on('line', line => {

    if ( line.match( /#/ ) ) {
    fields      = line.split( ':' ).slice();
      arr.push({
        foo: fields[0].trim(),
        bar: fields[1].trim(),
        abbr: fields[2].trim(),
        wholeword: fields[3].trim(),
      });
     }
  });

  readFile.on('close', function()  {
    for (var i = 0, l = arr.length; i < l; i++){
      if (arr[i].abbr == abbreviation){
       let needthis = arr[i].wholeword;
       console.log(arr[i].abbr + " --> " + needthis);
       return needthis;
      }
    }
});
}

lookup (кстати);

должен вернуть " между прочим "но на самом деле он возвращает только undefined .Однако вывод console.log внутри моей секции «close» readline успешен.Он просто не возвращает результат вызывающему вызову.Я нашел эту тему здесь ( Возвращает массив из модуля readline для node.js при событии закрытия ), но не смог отразить его в моем коде с успехом.Либо я получил сообщение «обратный вызов не является функцией», либо не было получено никакого значения, как ожидалось.Очевидно, я сделал что-то не так, пытаясь реализовать предложения из этого поста.

1-й вопрос:

Как правильно вернуть этот результат / результат?

Кроме того, я хотел бы узнать и понять, как лучше всего подойти к поиску хорошего исполнителя в этом примере.На самом деле я открываю + чтение + обработка текстового файла при каждом поиске.Я думаю, это нехорошо, и было бы более целесообразно, чтобы текстовый файл читался только один раз в начале и записывал необходимые строки в массив.Каждый поиск должен затем использовать этот массив в качестве таблицы поиска, чтобы найти соответствующую строку и вывести сокращенное слово.

2-й вопрос:

Какой будет наиболее эффективный подход для поиска

1 Ответ

0 голосов
/ 26 июня 2019

Я сам нашел и решил свой вопрос, и вот ответ:

это было действительно просто, и я не заметил этого в начале. Мне нужно поднять объявление переменной наверх, вне функции поиска. Это должно выглядеть так:

  var arr = [];

function lookup(abbreviation) {

  const readFile = readline.createInterface({
   input: fs.createReadStream('abbreviations.txt'),
   crlfDelay: Infinity
  });
[...]

Дополнительно, чтобы ответить на мой вопрос 2)

Я удалил блок из области чтения / закрытия и создал отдельную функцию поиска. Показанная здесь функция была переименована и использовалась как единая функция вызова, которая обрабатывает файл аббревиатуры один раз в начале, когда запускается приложение. Функция заполняет и заполняет массив «обр». С моей дополнительной функцией поиска я могу получить доступ к этому массиву "arr", и как только шаблон поиска будет найден в цикле for, я разрываю цикл и возвращаю значение поиска.

Проблема решена.

...