Une alternative plus propre à ce que @Ivo a suggéré serait une File d'attente de méthodes asynchrones, en supposant que vous n'ayez besoin de faire qu'un seul appel asynchrone pour la collection.
(Voir cet article de Dustin Diaz pour une explication plus détaillée)
function Queue() {
this._methods = [];
this._response = null;
this._flushed = false;
}
(function(Q){
Q.add = function (fn) {
if (this._flushed) fn(this._response);
else this._methods.push(fn);
}
Q.flush = function (response) {
if (this._flushed) return;
this._response = response;
while (this._methods[0]) {
this._methods.shift()(response);
}
this._flushed = true;
}
})(Queue.prototype);
Il vous suffit de créer une nouvelle instance de Queue
, d'ajouter les rappels dont vous avez besoin, puis de vider la file d'attente avec la réponse asynchrone.
var queue = new Queue();
queue.add(function(results){
for (var result in results) {
// opération de boucle normale ici
}
});
someFunction(param1, param2, function(results) {
queue.flush(results);
}
Un avantage supplémentaire de ce modèle est que vous pouvez ajouter plusieurs fonctions à la file d'attente au lieu d'une seule.
Si vous avez un objet contenant des fonctions d'itération, vous pouvez ajouter un support pour cette file d'attente en arrière-plan et écrire du code qui semble synchrone, mais ne l'est pas :
MyClass.each(function(result){ ... })
il suffit d'écrire each
pour mettre la fonction anonyme dans la file d'attente au lieu de l'exécuter immédiatement, puis vider la file d'attente lorsque votre appel asynchrone est terminé. Il s'agit d'un modèle de conception très simple et puissant.
P.S. Si vous utilisez jQuery, vous avez déjà à votre disposition une file d'attente de méthodes asynchrones appelée jQuery.Deferred.
128 votes
Wow
( /* ... */ )
ressemble à un monstre et j'ai peur maintenant :(