2016-12-13 2 views
-2

Mein Code wie folgt:Wie repariert man dieses Javascript Programm?

var data_array = []; 
readData('file.txt'); 
console.log(data_array[0]); 
console.log(data_array[1]); 
console.log(data_array.length.toString()); 
console.log(data_array[data_array.length-1]); 

//reads file into array 
function readData(filepath) { 
    var fs = require('fs'); 
    if (fs.existsSync(filepath)) { 
     var array = fs.readFileSync(filepath).toString().split("\n"); 
     var data_array = array.slice(7,array.length - 2); 
    } else { 
     process.exit(); 
    } 
} 

Als ich das laufen, habe ich folgende

undefined 
undefined 
0 
undefined 

See data_array innerhalb der if-Anweisung verwendet. ich glaube, das Array nichts erhalten hat, das ist, warum es nichts gedruckt wird, aber nicht definiert und seine Länge ist 0.

Wie kann ich es Schritt für Schritt dieser Zeilen in dem schriftlichen Auftrag

var data_array = []; 
readData('file.txt'); 
console.log(data_array[0]); 
console.log(data_array[1]); 
.... 
+1

Ihre 'readData' Funktion auf eine lokale Variable zu speichern, nicht die global one Sie sind Konsolenprotokollierung. – Jecoms

+1

data_array ist ein leeres Array und wird nie modifiziert. Was hast du erwartet? – manonthemat

+0

@Jecoms, ich erkannte, dass jetzt, thx – arslan

Antwort

3
ausführen erzwingen

Ihr Code schlägt fehl, weil Sie eine lokale Bereichsvariable erstellen und diese global schattieren. Ersetzen Sie zum Reparieren var data_array = array... durch data_array = array....

Auch bedenken Sie, dass Sie einige Antipatterns verwenden:

Überprüfen Sie zunächst nicht für die Datei Existenz vor dem Lesen - weil es möglich ist, für jemanden Datei zwischen Ihrem Schecks zu löschen. Lesen Sie es stattdessen und behandeln Sie die Ausnahme.

Zweitens, lesen Sie die Datei mit readFileSync(filepath, { encoding: 'utf8' }) - dies wird die Zeichenfolge sofort zurück, so dass Sie nicht toString() benötigen.

Dritte - array.slice() unterstützt negative Indizes (sie zählen vom Ende des Arrays), so können Sie buchstäblich array.slice(7, -2) haben.

Und im Allgemeinen, es sei denn, dies eine einzelne Anwendung Wegwerf-Code ist, würde ich vorschlagen, dass Sie asynchrone Funktion Pendants verwenden:

const Promise = require('bluebird'); 
const fs = Promise.promisifyAll(require('fs')); 

// reads file into array 
const readData = Promise.coroutine(function *(filepath) { 
    try { 
     const array = (yield fs.readFileAsync(filepath, { encoding: 'utf8' }) 
        ).split("\n"); 
     const data_array = array.slice(7, -2); 

     return data_array; 
    } catch(e) { 
     console.error(e); 
     process.exit(); 
    } 
}); 

Promise.coroutine(function *() { 
    const data_array = yield readData('file.txt'); 
    console.log(data_array[0]); 
    console.log(data_array[1]); 
    console.log(data_array.length.toString()); 
    console.log(data_array[data_array.length-1]); 
})(); 
+0

oder besser return data_array und zuweisen – xszaboj

+0

Danke, mein Fehler, verwendet var in Deklaration und später wieder vor Daten-Array. lol ... – arslan

+0

Ich habe versucht, Ihren Code, aber ein Fehler gemeldet. versuchen, es jetzt zu beheben – arslan

Verwandte Themen