Событие node readline 'line' не запускается

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

Я использую обещания, чтобы убедиться, что события происходят последовательно, но во второй раз событие «линия» не запускается.

'use strict'
const readLine = require('readline');
const fs = require('fs');

const wordList = require('./Trie.js');

function createTrie(reader, trie) {
  return new Promise((resolve, reject) => {
    if(typeof reader === 'undefined' || reader === null)
      reject('Failed')

    reader.on('line', line => trie.add(line))
    reader.on('close', () => {
      console.log('done')
      resolve(trie)
    })
  })
}

function findCommon(reader, trie) {
  return new Promise((resolve, reject) => {
    if(typeof reader === 'undefined' || reader === null) {
      console.log('failed')
      reject('Failed')
    }

    let commonWords = ''

    console.log('we are here')

    reader.on('line', (line) => {
      console.log(line) // This does not output
      if(line.length > 2 && trie.search(line)) {
        let word = line + '\n'
        commonWords += word
      }
    })
    reader.on('close', () => {
      fs.writeFile('wordlist.txt', commonWords, (err) => {
        if(err) {
          console.log(err)
          reject('error')
        }
        console.log('written')
        resolve('Success')
      })
    })
  })
}

let reader_1 = readLine.createInterface({
  input: fs.createReadStream('words/enable2k.txt')
})
let reader_2 = readLine.createInterface({
  input: fs.createReadStream('words/engmix.txt')
})

createTrie(reader_1, wordList)
  .then((trie) => findCommon(reader_2, trie))
  .then((data) => console.log(data))

Приведенный выше код дает следующий вывод

done
we are here

Событие «линия» не запускается. Кажется, я неправильно использую readline, но я не уверен.

Любая помощь приветствуется!


person Utkarsh    schedule 27.05.2017    source источник
comment
вы не задали выходной поток o.O   -  person 0.sh    schedule 28.05.2017
comment
@VictoryOsikwemhe Поскольку я просто читал из файла, а не писал в него и не устанавливал никаких подсказок для пользователя, я не устанавливал выходной поток. Я считаю, что выходной поток не является обязательным? :/   -  person Utkarsh    schedule 28.05.2017
comment
проверьте это stackoverflow.com /вопросы/35532332/   -  person 0.sh    schedule 28.05.2017


Ответы (2)


Очевидно, входной поток закрылся. Я зарегистрировал читатель в функции findCommon, и это был результат (только важная часть)

ReadStream {
     _readableState: 
      ReadableState {
        objectMode: false,
        highWaterMark: 65536,
        buffer: [Object],
        length: 0,
        pipes: null,
        pipesCount: 0,
        flowing: false,
        ended: true,
        endEmitted: true,
        reading: false,
        sync: false,
        needReadable: false,
        emittedReadable: false,
        readableListening: false,
        resumeScheduled: false,
        defaultEncoding: 'utf8',
        ranOut: false,
        awaitDrain: 0,
        readingMore: false,
        decoder: null,
        encoding: null },
     readable: false,
     domain: null,
     _events: { end: [Function] },
     _eventsCount: 1,
     _maxListeners: undefined,
     path: 'words/engmix.txt',
     fd: null,
     flags: 'r',
     mode: 438,
     start: undefined,
     end: undefined,
     autoClose: true,
     pos: undefined,
     bytesRead: 794434,
     destroyed: true,
     closed: true }

Я изменил вызов

createTrie(reader_1, wordList)
  .then((trie) => findCommon(reader_2, trie))
  .then((data) => console.log(data))

to:

createTrie(reader_1, wordList)
  .then((trie) => findCommon(readLine.createInterface({
    input: fs.createReadStream('words/engmix.txt')
  }), trie))
  .then((data) => console.log(data))

Этот способ сработал. Я точно не знаю, почему это работает, но это работает.

person Utkarsh    schedule 27.05.2017

Вы можете полностью отказаться от промисов и обратных вызовов и просто выполнять логику последовательно, используя nsynjs. Логика преобразуется следующим образом:

var nsynjs = require('nsynjs');
var textFile = require('./wrappers/nodeReadline').textFile; // this file is part of nsynjs

function process(textFile) {

    var fh = new textFile();
    fh.open('path/to/file1');
    var s, dict={};
    while (typeof(s = fh.readLine(nsynjsCtx).data) != 'undefined')
        dict[s] = true;
    fh.close();

    fh = new textFile();
    fh.open('path/to/file2');
    while (typeof(s = fh.readLine(nsynjsCtx).data) != 'undefined')
        if(dict[s])
            console.log(s);
    fh.close();

}

var ctx = nsynjs.run(process,{},textFile,function () {
    console.log('done');
});

Код выше основан на следующем примере: https://github.com/amaksr/nsynjs/blob/master/examples/node-readline/index.js

person amaksr    schedule 03.06.2017