Saya membaca tentang Deferreds and Promises dan terus membaca $.when.apply($, someArray)
. Saya sedikit tidak jelas tentang apa yang sebenarnya dilakukannya, mencari penjelasan bahwa satu baris berfungsi dengan tepat (bukan keseluruhan cuplikan kode). Berikut beberapa konteksnya:
var data = [1,2,3,4]; // the ids coming back from serviceA
var processItemsDeferred = [];
for(var i = 0; i < data.length; i++){
processItemsDeferred.push(processItem(data[i]));
}
$.when.apply($, processItemsDeferred).then(everythingDone);
function processItem(data) {
var dfd = $.Deferred();
console.log('called processItem');
//in the real world, this would probably make an AJAX call.
setTimeout(function() { dfd.resolve() }, 2000);
return dfd.promise();
}
function everythingDone(){
console.log('processed all items');
}
javascript
jquery
asynchronous
promise
manafire
sumber
sumber
.done()
dapat digunakan sebagai pengganti.then
dalam kasus ini, cukup FYI_.when
sehingga Anda tidak perlu menggunakanapply
.apply
: developer.mozilla.org/en-US/docs/JavaScript/Reference/… .Jawaban:
.apply
digunakan untuk memanggil fungsi dengan larik argumen. Ini mengambil setiap elemen dalam larik, dan menggunakan masing-masing sebagai parameter untuk fungsi..apply
juga bisa mengubah konteks (this
) di dalam fungsi.Jadi, ayo ambil
$.when
. Ini digunakan untuk mengatakan "ketika semua janji ini diselesaikan ... lakukan sesuatu". Dibutuhkan jumlah parameter yang tak terbatas (variabel).Dalam kasus Anda, Anda memiliki serangkaian janji; Anda tidak tahu berapa banyak parameter yang Anda teruskan
$.when
. Meneruskan array itu sendiri$.when
tidak akan berfungsi, karena ia mengharapkan parameternya berupa promise, bukan array.Di situlah
.apply
masuk. Dibutuhkan array, dan memanggil$.when
dengan setiap elemen sebagai parameter (dan memastikanthis
disetel kejQuery
/$
), jadi semuanya berfungsi :-)sumber
$.when
tunggu saja semuanya selesai sebelum melanjutkan.$.when($, arrayOfPromises).done(...)
dan$.when(null, arrayOfPromises).done(...)
(yang saya temukan keduanya sebagai solusi yang diusulkan di forum ...)$ .when mengambil sejumlah parameter dan menyelesaikan saat semua ini telah diselesaikan.
anyFunction .apply (thisValue, arrayParameters) memanggil fungsi anyFunction yang menyetel konteksnya (thisValue akan menjadi ini dalam pemanggilan fungsi itu) dan meneruskan semua objek dalam arrayParameters sebagai parameter individual.
Sebagai contoh:
Sama dengan:
Tapi menerapkan cara panggilan memungkinkan Anda untuk melewatkan array jumlah yang tidak diketahui parameter. (Dalam kode Anda, Anda mengatakan bahwa data Anda berasal dari layanan, maka itulah satu-satunya cara untuk memanggil $ .when )
sumber
Di sini, kode didokumentasikan dengan lengkap.
sumber
$.when.apply($, array)
adalah tidak sama dengan$.when(array)
. Ini sama dengan:$.when(array[0], array[1], ...)
Sayangnya saya tidak setuju dengan kalian.
Akan menelepon
everythingDone
segera setelah satu penangguhan ditolak , meskipun ada penangguhan lain yang menunggu keputusan .Berikut skrip lengkapnya (saya sarankan http://jsfiddle.net/ ):
Apakah ini bug? Saya ingin menggunakan ini seperti yang dijelaskan pria di atas.
sumber
Mungkin seseorang dapat menemukan ini berguna:
everythingDone tidak dipanggil jika ada penolakan
sumber
$ .when saja memungkinkan panggilan balik untuk dipanggil ketika setiap janji yang diteruskan kepadanya diselesaikan / ditolak. Biasanya, $ .when mengambil sejumlah variabel argumen, menggunakan .apply memungkinkan untuk meneruskannya ke sebuah array argumen, itu sangat kuat. Untuk info lebih lanjut tentang .apply: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply
sumber
Terima kasih atas solusi elegan Anda:
Hanya satu poin: Saat menggunakan
resolveWith
untuk mendapatkan beberapa parameter, itu rusak karena janji awal disetel ke tidak ditentukan. Apa yang saya lakukan untuk membuatnya berhasil:sumber