Zusammenfassung: Gibt es einige bewährte Best-Practice-Muster, die ich befolgen kann, um meinen Code trotz der Verwendung von asynchronem Code und Rückrufen lesbar zu halten?
Ich verwende eine JavaScript-Bibliothek, die viele Dinge asynchron erledigt und stark von Rückrufen abhängt. Es scheint, dass das Schreiben einer einfachen Methode "Laden A, Laden B, ..." ziemlich kompliziert und mit diesem Muster schwer zu befolgen ist.
Lassen Sie mich ein (erfundenes) Beispiel geben. Angenommen, ich möchte eine Reihe von Bildern (asynchron) von einem Remote-Webserver laden. In C # / async würde ich so etwas schreiben:
disableStartButton();
foreach (myData in myRepository) {
var result = await LoadImageAsync("http://my/server/GetImage?" + myData.Id);
if (result.Success) {
myData.Image = result.Data;
} else {
write("error loading Image " + myData.Id);
return;
}
}
write("success");
enableStartButton();
Das Codelayout folgt dem "Ablauf der Ereignisse": Zuerst wird die Startschaltfläche deaktiviert, dann werden die Bilder geladen ( await
stellt sicher, dass die Benutzeroberfläche reagiert) und dann wird die Startschaltfläche wieder aktiviert.
In JavaScript habe ich mithilfe von Rückrufen Folgendes gefunden:
disableStartButton();
var count = myRepository.length;
function loadImage(i) {
if (i >= count) {
write("success");
enableStartButton();
return;
}
myData = myRepository[i];
LoadImageAsync("http://my/server/GetImage?" + myData.Id,
function(success, data) {
if (success) {
myData.Image = data;
} else {
write("error loading image " + myData.Id);
return;
}
loadImage(i+1);
}
);
}
loadImage(0);
Ich denke, die Nachteile liegen auf der Hand: Ich musste die Schleife in einen rekursiven Aufruf umwandeln, der Code, der am Ende ausgeführt werden soll, befindet sich irgendwo in der Mitte der Funktion, der Code, der den Download ( loadImage(0)
) startet, befindet sich ganz unten. und es ist im Allgemeinen viel schwieriger zu lesen und zu folgen. Es ist hässlich und ich mag es nicht.
Ich bin mir sicher, dass ich nicht der erste bin, der auf dieses Problem stößt. Meine Frage lautet daher: Gibt es einige bewährte Best-Practice-Muster, die ich befolgen kann, um meinen Code trotz der Verwendung von asynchronem Code und Rückrufen lesbar zu halten?
LoadImageAsync
in der Tat ein Aufruf Ext.Ajax.request
von Sencha Touch.
async.waterfall
ist Ihre Antwort.