Ich habe einen Stream, den ich verarbeiten, indem ich auf die Ereignisse data
, error
und end
Ereignisse abhöre, und ich rufe eine Funktion auf, jedes data
Ereignis im ersten Stream zu verarbeiten. Natürlich ruft die Funktion, die die Daten verarbeitet, andere Rückrufe auf, was sie asynchron macht. Wie beginne ich mehr Code auszuführen, wenn die Daten im Stream verarbeitet werden? Das Abhören des end
Ereignisses im Stream bedeutet NICHT, dass die asynchronen data
Verarbeitungsfunktionen beendet sind.Wie kann sichergestellt werden, dass der asynchrone Code ausgeführt wird, nachdem ein Stream verarbeitet wurde?
Wie kann ich sicherstellen, dass die Stream-Datenverarbeitungsfunktionen beendet sind, wenn ich meine nächste Anweisung ausfühle? Hier
ein Beispiel:
function updateAccountStream (accountStream, callThisOnlyAfterAllAccountsAreMigrated) {
var self = this;
var promises = [];
accountStream
.on('data', function (account) {
migrateAccount.bind(self)(account, finishMigration);
})
.on('error', function (err) {
return console.log(err);
})
.on('end', function() {
console.log("Finished updating account stream (but finishMigration is still running!!!)");
callThisOnlyAfterAllAccountsAreMigrated() // finishMigration is still running!
});
}
var migrateAccount = function (oldAccount, callback) {
executeSomeAction(oldAccount, function(err, newAccount) {
if (err) return console.log("error received:", err);
return callback(newAccount);
});
}
var finishMigration = function (newAccount) {
// some code that is executed asynchronously...
}
Wie stelle ich sicher, dass callThisOnlyAfterAllAccountsAreMigrated
aufgerufen wird, nachdem der Strom verarbeitet worden ist?
Kann dies mit Versprechungen getan werden? Kann es mit durchgehenden Streams gemacht werden? Ich arbeite mit Nodejs, daher könnte die Bezugnahme auf andere npm-Module hilfreich sein.
Für mich ist das 'end' Ereignis scheint ziemlich nützlich, als dass der Punkt, wo Sie beginnen müssen schauen, wie viele Arbeitsplätze noch laufen , so dass Sie den letzten Rückruf auslösen können, wenn keine weiteren übrig sind. – Bergi
@Bergi Guter Punkt, ich habe geklärt, worauf ich hinauswollte. – Brad
@Brad Ich denke, dass Ihre Lösung, die Versprechungen und das "lesbare" Ereignis verwendet, effektiver ist als meine obige Lösung. Würde es Ihnen etwas ausmachen, ein Codierungsbeispiel hinzuzufügen? Versprechen sind ein wenig schwierig, so dass es hilfreich wäre, Versprechungen in Aktion auf den Code der Frage zu sehen ... – modulitos