2017-03-07 96 views
1

配列の各要素がテキストファイルの行になるように配列を作成しようとしました。配列にデータが設定されたら、配列を使用する必要があります。Node.js readlineを使用して配列を作成して使用する

だから私はやった:

rl.on('line', (input) => { 

    ar.push(input); 

}); 
rl.on('close', (input) => { 

    console.log(ar); 

}); 

しかし、私は続行する前に、5つの以上のファイルを読むために必要があります。

var ar = new Array(); 
var rl = require('readline').createInterface({ 
    input: require('fs').createReadStream('myfile'), 
    terminal: false 
}); 
rl.on('line', (input) => { 

    ar.push(input); 

}); 
console.log(ar); // I shall be using the array after this 

また、この意志は動作します。また、イベント「close」をネストされたフォームで使用すると、コードがクラスタ化されて汚れてしまいます。進むべき他の方法はありますか? NB:Node.jsの新機能です

答えて

1

NodeJSは非同期で、readlineはイベントベースであるため、言語のようなコードプロシージャの順序で操作が行われることはありません。

まず、制御フローを実装します。大きな選択肢はPromisesです。

次に、LOCAL配列にプッシュする行イベントを処理して、正しい範囲を確保することができます。例えば、あなたのコードでは、記録された配列は空であるかもしれません、なぜなら、操作は異なるスコープと瞬間に起こるからです。

だから、あなたは、この(おそらくより良い方法ではありません)のように気にいらを行うことができます。

const fs = require('fs') 
const readline = require('readline') 
const Promise = require('bluebird') 

function fillArrayWithFileData(file) { 
    return new Promise((resolve, reject) => { 
     const array = [] 
     let rl = readline.createInterface({ 
      input: fs.createReadStream(file) 
     }); 
     rl.on('line', line => { 
      array.push(line) 
     }); 
     rl.on('close',()=>{ 
      return resolve(array) 
     }) 
    }) 
} 
//The list of relative paths to file, here in ./ 
let files = [ 
    'myfile1.txt', 
    'myfile2.txt', 
    'myfile3.txt', 
    'myfile4.txt', 
    'myfile5.txt', 
    'myfile6.txt'] 
    .map(f => fillArrayWithFileData(f)) 

return Promise 
    .all(files) 
    .then(allData => { 
     console.log(allData) 
    }) 

PS:新しいArray()を、使用することを間違っていないですが、あなたはdeclare an arrayにだけ、[]を使用することができます。

関連する問題