ฉันมีแอปพลิเคชันที่ต้องโหลดข้อมูลตามลำดับที่กำหนด: URL รูทจากนั้นสคีมาจากนั้นจึงเริ่มต้นแอปพลิเคชันด้วยสกีมาและ URL สำหรับวัตถุข้อมูลต่างๆ ในขณะที่ผู้ใช้สำรวจแอปพลิเคชันอ็อบเจ็กต์ข้อมูลจะถูกโหลดตรวจสอบความถูกต้องกับสคีมาและแสดง เนื่องจากผู้ใช้ CRUD ข้อมูลสคีมาจะให้การตรวจสอบความถูกต้องก่อน
ฉันมีปัญหากับการเริ่มต้น ฉันใช้การเรียก Ajax เพื่อดึงอ็อบเจ็กต์รูท $. เมื่อ () จากนั้นสร้างอาร์เรย์ของสัญญาหนึ่งรายการสำหรับแต่ละออบเจ็กต์สคีมา ที่ได้ผล ฉันเห็นการดึงข้อมูลในคอนโซล
จากนั้นฉันเห็นการดึงข้อมูลสำหรับสคีมาทั้งหมดดังนั้นการเรียก $ .ajax () แต่ละครั้งจึงใช้ได้ fetchschemas () ส่งคืนอาร์เรย์ของสัญญา
อย่างไรก็ตามสุดท้ายเมื่อประโยค () ไม่เคยเริ่มทำงานและคำว่า "DONE" จะไม่ปรากฏบนคอนโซล ซอร์สโค้ดไปยัง jquery-1.5 ดูเหมือนจะบอกเป็นนัยว่า "null" เป็นที่ยอมรับในฐานะอ็อบเจกต์ที่จะส่งผ่านไปยัง $ .when.apply () เนื่องจากเมื่อ () จะสร้างอ็อบเจ็กต์ Deferred () ภายในเพื่อจัดการรายการหากไม่มีอ็อบเจ็กต์ ผ่านเข้ามา
สิ่งนี้ใช้ได้กับ Futures.js อาร์เรย์ของ jQuery Deferreds ควรได้รับการจัดการอย่างไรหากไม่เป็นเช่นนี้
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);
});
});