2016-11-16 1 views
0

Ich schrieb den folgenden Code:Node.JS: Warum verschwindet der Inhalt der globalen Variablen außerhalb einer Callback-Funktion?

var csv = require('csv-parser') 
var fs = require('fs') 

var devices = [] 
fs.createReadStream('devices.csv') 
    .pipe(csv()) 
    .on('data', function (data) { 
     devices.push(data) 
    }); 

console.log(devices) 

Die Linie devices.push (Daten) in jeder Zeile die CSV-Datei in das globale Array 'Geräte' einzufügen. Unglücklicherweise, wenn ich die letzte Zeile in meinem Code (außerhalb des Rückrufs) erreiche, sehe ich, dass Geräte wieder leer Array ist. Warum passiert das und wie kann ich es so einrichten, wie ich es will?

+0

Sie haben es rückwärts. Sie erreichen die letzte Zeile im Code zuerst, wenn das Array noch leer ist, und danach, wenn der Callback ausgeführt wird, wird er mit den Daten gefüllt. – Bergi

Antwort

2

Die Stream-Verarbeitung ist asynchron (Sie können sich vorstellen, dass sie im Hintergrund mit Ereignisbenachrichtigungen ausgeführt wird und der Rest Ihres Codes weiterhin ausgeführt werden kann). Wenn Sie .pipe() und .on('data') tun, starten Sie gerade die Stream-Operation und legen dann einen Event-Handler fest, der in Zukunft eine unbestimmte Zeit genannt wird. Der Rest Ihres Codes wird weiterhin ausgeführt.

Ihre Codezeile console.log(devices) läuft VOR dem Stream-Parsing. Sie müssen sich für ein Ereignis registrieren, das das Ende der Stream-Analyse signalisiert, und dann das Array devices in diesem Ereignishandler betrachten.

var csv = require('csv-parser') 
var fs = require('fs') 

var devices = [] 
fs.createReadStream('devices.csv') 
    .pipe(csv()) 
    .on('data', function (data) { 
     devices.push(data) 
    }).on('end', function() { 
     // use the devices array in here 
     console.log(devices); 
    }); 

node.js Stream-Ereignisse werden here dokumentiert.

Verwandte Themen