2017-03-07 3 views
1

Ich habe versucht, ein Array so zu füllen, dass jedes Element im Array eine Zeile einer Textdatei ist. Und sobald das Array gefüllt ist, muss ich das Array verwenden.Node.js füllen Array mit readline und verwenden

Also habe ich:

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 

Alternativ dieser Wille funktioniert:

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

    ar.push(input); 

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

    console.log(ar); 

}); 

Aber ich brauche 5 oder mehr Dateien zu lesen, bevor ich fortfahren. Wenn das Ereignis 'close' in einer verschachtelten Form verwendet wird, wird der Code gruppiert und schmutzig. Gibt es einen anderen Weg, um fortzufahren? Anmerkung: Bin sehr neu in Node.js

Antwort

1

Da NodeJS asynchron ist und readline ereignisbasiert ist, werden die Operationen nicht in der Reihenfolge der Codeprozeduren wie Sprachen ausgeführt.

Also, das erste, was zu tun ist, implementieren einige Kontrollfluss. Eine gute Option ist Promises.

Dann können Sie das Zeilenereignis behandeln, indem Sie auf ein LOCAL-Array drücken, um den richtigen Bereich sicherzustellen. In Ihrem Code ist beispielsweise das geloggte Array wahrscheinlich leer, da die Vorgänge in verschiedenen Bereichen und Zeitpunkten ausgeführt werden.

So können Sie somthing wie dies tun (wahrscheinlich nicht der bessere Weg ist):

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: nicht falsch new Array() zu verwenden, aber Sie können nur [], um declare an array verwenden.