Anda belum terlalu spesifik dengan kode Anda, jadi saya akan membuat skenario. Katakanlah Anda memiliki 10 panggilan ajax dan Anda ingin mengumpulkan hasil dari 10 panggilan ajax tersebut dan kemudian ketika semuanya telah selesai Anda ingin melakukan sesuatu. Anda dapat melakukannya seperti ini dengan mengumpulkan data dalam array dan melacak kapan yang terakhir selesai:
Penghitung Manual
var ajaxCallsRemaining = 10;
var returnedData = [];
for (var i = 0; i < 10; i++) {
doAjax(whatever, function(response) {
// success handler from the ajax call
// save response
returnedData.push(response);
// see if we're done with the last ajax call
--ajaxCallsRemaining;
if (ajaxCallsRemaining <= 0) {
// all data is here now
// look through the returnedData and do whatever processing
// you want on it right here
}
});
}
Catatan: penanganan error penting di sini (tidak ditampilkan karena ini khusus untuk cara Anda melakukan panggilan ajax). Anda akan ingin memikirkan bagaimana Anda akan menangani kasus ketika satu panggilan ajax tidak pernah selesai, baik dengan kesalahan atau macet untuk waktu yang lama atau waktu habis setelah waktu yang lama.
jQuery Janji
Menambah jawaban saya pada tahun 2014. Akhir-akhir ini, $.ajax()
promise sering digunakan untuk menyelesaikan masalah jenis ini karena jQuery sudah mengembalikan sebuah promise dan $.when()
akan memberi tahu Anda saat sekelompok promise telah diselesaikan dan akan mengumpulkan hasil yang dikembalikan untuk Anda:
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push($.ajax(...));
}
$.when.apply($, promises).then(function() {
// returned data is in arguments[0][0], arguments[1][0], ... arguments[9][0]
// you can process it here
}, function() {
// error occurred
});
Janji Standar ES6
Seperti yang ditentukan dalam jawaban kba : jika Anda memiliki lingkungan dengan promise bawaan (browser modern atau node.js atau menggunakan babeljs transpile atau menggunakan promise polyfill), Anda dapat menggunakan promise yang ditentukan ES6. Lihat tabel ini untuk dukungan browser. Janji didukung di hampir semua browser saat ini, kecuali IE.
Jika doAjax()
mengembalikan sebuah promise, Anda dapat melakukan ini:
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
// returned data is in arguments[0], arguments[1], ... arguments[n]
// you can process it here
}, function(err) {
// error occurred
});
Jika Anda perlu membuat operasi asinkron non-promise menjadi operasi yang mengembalikan promise, Anda bisa "menjanjikan" seperti ini:
function doAjax(...) {
return new Promise(function(resolve, reject) {
someAsyncOperation(..., function(err, result) {
if (err) return reject(err);
resolve(result);
});
});
}
Dan, kemudian gunakan pola di atas:
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
// returned data is in arguments[0], arguments[1], ... arguments[n]
// you can process it here
}, function(err) {
// error occurred
});
Janji Bluebird
Jika Anda menggunakan pustaka yang lebih kaya fitur seperti pustaka janji Bluebird , maka itu memiliki beberapa fungsi tambahan bawaan untuk membuatnya lebih mudah:
var doAjax = Promise.promisify(someAsync);
var someData = [...]
Promise.map(someData, doAjax).then(function(results) {
// all ajax results here
}, function(err) {
// some error here
});