2017-05-27 94 views
0

我正在創建一個該程序,該程序可以找到2個單詞文件的常見單詞,然後使用常用單詞創建一個新文件。 我使用readline模塊讀取第一個單詞文件的每個單詞,然後將該單詞存儲在Trie中。在完成之後,我正在嘗試從另一個單詞文件讀取單詞,如果它位於trie中,我正在寫入文件。節點readline'line'事件未觸發

我使用promises來確保事件順序發生,但第二次'行'事件沒有觸發。

'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,但我不確定。

任何幫助表示讚賞!

+0

因爲我只是從文件中讀取和不寫它,你沒有設置輸出流OO –

+0

@VictoryOsikwemhe或爲用戶設置任何提示,我沒有設置輸出流。我相信輸出流是可選的? :/ – Utkarsh

+0

檢查了這個https://stackoverflow.com/questions/35532332/how-does-readline-rl-write-work?rq=1 –

回答

0

顯然輸入流已關閉。 我登錄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)) 

這樣的工作。我不確定這是爲什麼這個工程,但它確實。

0

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