【问题标题】:Node readline 'line' event not firing节点 readline 'line' 事件未触发
【发布时间】:2017-05-27 22:09:01
【问题描述】:

我正在创建一个此程序,它会查找 2 个单词文件的常用词,然后创建一个仅包含常用词的新文件。 我正在使用 readline 模块读取第一个单词文件的每个单词,然后将该单词存储在 Trie 中。完成后,我正在尝试从另一个 word 文件中读取单词,如果它在 trie 中,我正在写入文件。

我正在使用 Promise 来确保事件按顺序发生,但不会触发第二次 'line' 事件。

'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

'line' 事件未触发。似乎我没有正确使用 readline 但我不确定。

感谢任何帮助!

【问题讨论】:

  • 你没有设置输出流o.O
  • @VictoryOsikwemhe 因为我只是从文件中读取而不是写入文件或为用户设置任何提示,所以我没有设置输出流。我相信输出流是可选的? ://

标签: javascript node.js events promise readline


【解决方案1】:

显然输入流已经关闭。 我在 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))

到:

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

这种方法奏效了。我不确定为什么会这样,但确实如此。

【讨论】:

    【解决方案2】:

    您可以完全避免承诺和回调,只需使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多