2016-05-13 4 views
0

ich einige Code wie dies gesehen haben:Wie Zugriff auf Daten nur einmal alles ist bereit

.on('error', console.error) 
    .on('data', function (data) {}) 
    .on('info', function(info) {}) 
    .on('end', function() { 
    // All data retrieved. 
    }); 

ich einige docs habe über Bäche, aber Mühe habe sie zu verstehen. Sagen wir, ich möchte nur die Operationen ausführen, sobald alle Daten empfangen wurden (nicht teilweise). Wie kann ich das machen? Ich würde denken, ich müsste das Datenobjekt innerhalb der "Ende" -Funktion lesen, aber das Datenobjekt ist von dort nicht zugänglich.

Von meinem Verständnis, wenn ich etwas Logik innerhalb der "Daten" -Funktion einsetze, könnte ich auf unvollständigen Daten operieren? Ist das wahr? Sag Daten sind eine Liste von Freunden (einige Listen haben 1 Freund einige können 10.000 haben, so dass die Größe der Daten zurückgegeben wird anders sein). Wie kann ich nur operieren, wenn alle Freunde zurückgegeben werden, unabhängig von der Größe der zurückkommenden Daten?

Antwort

2

Der Handler data wird normalerweise mehrmals aufgerufen, jedes Mal mit einem Bruchteil der vollständigen Daten.

Wenn Sie eine Aktion einmal mit alle Daten durchführen möchten, ist die übliche Art und Weise, wie folgt:

Buffer alle Elemente in der data Handler in irgendeiner Variable empfangen (zB in den ein Array) und führen Sie Ihre letzte Aktion im end Handler durch. (Obwohl die Idee eines Stromes natürlich ist, sofort zu "handeln").

var allData = []; 
stream 
.on('error', console.error) 
.on('data', function (data) { 
    allData.push(data); 
}) 
.on('info', function(info) {}) 
.on('end', function() { 
    // TODO do something more intelligent, 
    // where buffering in memory makes sense 
    console.log(allData.join()); 
});