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);
});
});