2017-05-27 3 views
0

私はこのプログラムを作成しています。このプログラムは、2つのワードファイルの共通ワードを見つけて、共通ワードだけで新しいファイルを作成します。 私は最初の単語ファイルの各単語を読むためにreadlineモジュールを使い、その単語をTrieに保存しています。それが完了した後、私は他の単語ファイルから単語を読み込もうとしています、そしてそれがトライであれば、私はファイルに書きます。ノードのreadline 'line'イベントが起動しない

私は、イベントが順番に発生することを約束していますが、2回目は '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 

を与え '行' イベントがトリガされません。私は正しくreadlineを使用していないようですが、わかりません。

ご協力いただきましてありがとうございます。

+0

私は、ファイルからの読み込みと、それに書き込むか、いなかったので、あなたは、出力ストリームオブジェクト指向 –

+0

@VictoryOsikwemheを設定しなかった、以下のようにロジックを変えていきますユーザーのプロンプトを設定すると、私は出力ストリームを設定しませんでした。出力ストリームはオプションであると私は信じていますか? :/ – Utkarsh

+0

これをチェックしてくださいhttps://stackoverflow.com/questions/35532332/how-does-readline-rl-write-work?rq=1 –

答えて

0

明らかに入力ストリームが閉じていました。

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

この方法が働い:私への呼び出しを

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

修飾 Iは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 } 

結果でした。私は正確になぜこれが動作するのか分かりませんが、それはありません。

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

関連する問題