Saya memiliki aplikasi yang memerlukan data dimuat dalam urutan tertentu: URL root, lalu skema, lalu akhirnya menginisialisasi aplikasi dengan skema dan url untuk berbagai objek data. Saat pengguna menavigasi aplikasi, objek data dimuat, divalidasi terhadap skema, dan ditampilkan. Sebagai pengguna CRUD data, skema menyediakan validasi first-pass.
Saya mengalami masalah dengan inisialisasi. Saya menggunakan panggilan Ajax untuk mengambil objek root, $ .when (), dan kemudian membuat array janji, satu untuk setiap objek skema. Itu bekerja. Saya melihat pengambilan di konsol.
Saya kemudian melihat pengambilan untuk semua skema, sehingga setiap panggilan $ .ajax () berfungsi. fetchschemas () memang mengembalikan sejumlah janji.
Namun, kalimat terakhir ketika () klausa tidak pernah menyala dan kata "DONE" tidak pernah muncul di konsol. Kode sumber ke jquery-1.5 tampaknya menyiratkan bahwa "null" dapat diterima sebagai objek untuk diteruskan ke $ .when.apply (), seperti ketika () akan membangun objek internal Deferred () untuk mengelola daftar jika tidak ada objek yang lewat.
Ini berfungsi menggunakan Futures.js. Bagaimana seharusnya array jQuery Deferreds dikelola, jika tidak seperti ini?
var fetch_schemas, fetch_root;
fetch_schemas = function(schema_urls) {
var fetch_one = function(url) {
return $.ajax({
url: url,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
return $.map(schema_urls, fetch_one);
};
fetch_root = function() {
return $.ajax({
url: BASE_URL,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
$.when(fetch_root()).then(function(data) {
var promises = fetch_schemas(data.schema_urls);
$.when.apply(null, promises).then(function(schemas) {
console.log("DONE", this, schemas);
});
});
sumber
Jawaban:
Kamu sedang mencari
Ini juga akan berfungsi (untuk beberapa nilai pekerjaan, itu tidak akan memperbaiki patah ajax):
Anda ingin lulus
$
alih-alihnull
agarthis
bagian dalam$.when
mengacujQuery
. Seharusnya tidak masalah untuk sumbernya, tetapi lebih baik daripada lewatnull
.Mengejek semua $ .ajax Anda dengan menggantinya dengan
$.when
dan sampel berfungsiJadi itu bisa menjadi masalah dalam permintaan ajax Anda atau array yang Anda lewati untuk fetch_schemas.
sumber
.then(a,b) === .done(a).fail(b)
ini tulisan cepat yang malas. Anda dapat menelepon.done(a).fail(b)
jika Anda mau$.when.apply($, ...
. Thenull
membuat saya pergi "menunggu, apa?". Ini masalah gaya dan praktik pengkodean. Saya harus membaca sumber untuk mengkonfirmasithis
tidak akan membuang referensi nol di dalam jQuery.when!Solusi di atas (terima kasih!) Tidak dengan benar mengatasi masalah untuk mendapatkan kembali objek yang disediakan untuk metode yang ditangguhkan
resolve()
karena jQuery memanggildone()
dan memanggil kembalifail()
dengan parameter individual, bukan array. Itu berarti kita harus menggunakanarguments
pseudo-array untuk mendapatkan semua objek yang diselesaikan / ditolak dikembalikan oleh array yang ditangguhkan, yang jelek:Karena kami melewati dalam array yang ditangguhkan, alangkah baiknya untuk mendapatkan kembali array hasil. Akan lebih baik untuk mendapatkan kembali array aktual alih-alih pseudo-array sehingga kita dapat menggunakan metode seperti
Array.sort()
.Berikut ini adalah solusi terinspirasi oleh when.js 's
when.all()
metode yang alamat masalah ini:Sekarang Anda dapat dengan mudah memasukkan array dari ditangguhkan / janji dan mendapatkan kembali array objek yang diselesaikan / ditolak dalam panggilan balik Anda, seperti:
sumber
apply()
... mencari tahu.arguments
manipulasi tersembunyi ke dalam metode sendiri. Bagus untuk digunakan kembali, tetapi tidak membahas "keburukan" karena harus berurusan denganarguments
(Anda bisa dengan mudah hanya:var schemas=Array.prototype.slice.call(arguments);)
deferred.fail(...)
membacadeferred.reject(...)
?Jika Anda menggunakan versi ES6 dari javascript Ada operator spread (...) yang mengubah array objek menjadi argumen yang dipisahkan koma.
Lebih lanjut tentang operator penyebaran ES6 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator temukan di sini
sumber
meluas ketika dengan kode ini:
sumber