@Ivo'nun önerdiğine daha temiz bir alternatif , koleksiyon için yalnızca bir eşzamansız çağrı yapmanız gerektiğini varsayarak Eşzamansız Yöntem Kuyruğu olacaktır .
( Daha ayrıntılı bir açıklama için Dustin Diaz'ın yazdığı bu gönderiye bakın )
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);
Basitçe yeni bir örnek oluşturursunuz Queue, ihtiyacınız olan geri aramaları eklersiniz ve ardından kuyruğu eşzamansız yanıt ile temizlersiniz.
var queue = new Queue();
queue.add(function(results){
for (var result in results) {
}
});
someFunction(param1, param2, function(results) {
queue.flush(results);
}
Bu kalıbın ek bir avantajı, kuyruğa tek bir işlev yerine birden çok işlev ekleyebilmenizdir.
Yineleyici işlevleri içeren bir nesneniz varsa, bu kuyruk için arka planda destek ekleyebilir ve eşzamanlı görünen ancak olmayan kod yazabilirsiniz:
MyClass.each(function(result){ ... })
sadece eachanonim işlevi hemen çalıştırmak yerine kuyruğa koymak için yazın ve sonra eşzamansız çağrınız tamamlandığında kuyruğu temizleyin. Bu çok basit ve güçlü bir tasarım modelidir.
PS jQuery kullanıyorsanız, emrinizde jQuery.Deferred adında bir zaman uyumsuz yöntem kuyruğunuz zaten var .
( /* ... */ )canavara benziyor ve şimdi korkuyorum :(