Résumé: Existe-t-il des modèles de bonnes pratiques bien établis que je peux suivre pour garder mon code lisible malgré l'utilisation de code asynchrone et de rappels?
J'utilise une bibliothèque JavaScript qui fait beaucoup de choses de manière asynchrone et s'appuie fortement sur les rappels. Il semble que l'écriture d'une méthode simple "charger A, charger B, ..." devienne assez compliquée et difficile à suivre en utilisant ce modèle.
Permettez-moi de donner un exemple (artificiel). Disons que je veux charger un tas d'images (de manière asynchrone) à partir d'un serveur Web distant. En C # / async, j'écrirais quelque chose comme ceci:
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();
La disposition du code suit le "flux d'événements": tout d'abord, le bouton de démarrage est désactivé, puis les images sont chargées ( await
garantit que l'interface utilisateur reste sensible), puis le bouton de démarrage est réactivé.
En JavaScript, en utilisant des rappels, j'ai trouvé ceci:
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);
Je pense que les inconvénients sont évidents: j'ai dû retravailler la boucle en un appel récursif, le code qui devrait être exécuté à la fin est quelque part au milieu de la fonction, le code commençant le téléchargement ( loadImage(0)
) est tout en bas, et c'est généralement beaucoup plus difficile à lire et à suivre. C'est moche et je n'aime pas ça.
Je suis sûr que je ne suis pas le premier à rencontrer ce problème, donc ma question est: Y a-t-il des modèles de bonnes pratiques bien établis que je peux suivre pour garder mon code lisible malgré l'utilisation de code asynchrone et de rappels?
LoadImageAsync
c'est en fait un appel à Ext.Ajax.request
Sencha Touch.
async.waterfall
est votre réponse.