Kodunuz konusunda çok spesifik değildiniz, bu yüzden bir senaryo oluşturacağım. Diyelim ki 10 ajax çağrınız var ve bu 10 ajax çağrısının sonuçlarını toplamak istiyorsunuz ve sonra hepsi tamamlandığında bir şeyler yapmak istiyorsunuz. Verileri bir dizide toplayarak ve sonuncunun ne zaman bittiğini takip ederek bunu şu şekilde yapabilirsiniz:
Manuel Sayaç
var ajaxCallsRemaining = 10;
var returnedData = [];
for (var i = 0; i < 10; i++) {
doAjax(whatever, function(response) {
returnedData.push(response);
--ajaxCallsRemaining;
if (ajaxCallsRemaining <= 0) {
}
});
}
Not: Hata işleme burada önemlidir (ajax çağrılarınızı nasıl yaptığınızla ilgili olduğu için gösterilmemiştir). Bir ajax çağrısı ya bir hata ile ya da uzun bir süre takılı kaldığında ya da uzun bir süre sonra zaman aşımına uğradığında, bir ajax çağrısı asla tamamlanmadığında, durumu nasıl ele alacağınızı düşünmek isteyeceksiniz.
jQuery Sözleri
2014'teki cevabıma ekliyorum. Bugünlerde, jQuery $.ajax()
zaten bir söz verdiğinden ve $.when()
bir grup sözün tamamının çözüldüğünde size haber vereceğinden ve sizin için geri dönüş sonuçlarını toplayacağından bu tür bir sorunu çözmek için sözler sıklıkla kullanılmaktadır :
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push($.ajax(...));
}
$.when.apply($, promises).then(function() {
}, function() {
});
ES6 Standart Vaatleri
Kba'nın cevabında belirtildiği gibi : yerleşik vaatleri olan bir ortamınız varsa (modern tarayıcı veya node.js veya babeljs transpile veya bir vaat çoklu doldurma kullanarak), o zaman ES6 tarafından belirtilen vaatleri kullanabilirsiniz. Tarayıcı desteği için bu tabloya bakın . Sözler, IE hariç hemen hemen tüm mevcut tarayıcılarda desteklenmektedir.
doAjax()
Bir söz verirse , şunu yapabilirsiniz:
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
}, function(err) {
});
Söz vermeyen zaman uyumsuz bir işlemi bir söz veren bir işlemde yapmanız gerekiyorsa, bunu şu şekilde "söz verebilirsiniz":
function doAjax(...) {
return new Promise(function(resolve, reject) {
someAsyncOperation(..., function(err, result) {
if (err) return reject(err);
resolve(result);
});
});
}
Ve sonra yukarıdaki kalıbı kullanın:
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
}, function(err) {
});
Bluebird Sözleri
Bluebird vaat kitaplığı gibi daha zengin özelliklere sahip bir kitaplık kullanıyorsanız , bunu kolaylaştırmak için bazı ek işlevler yerleşik olarak bulunur:
var doAjax = Promise.promisify(someAsync);
var someData = [...]
Promise.map(someData, doAjax).then(function(results) {
}, function(err) {
});