У мене є додаток, який вимагає завантаження даних у певному порядку: коренева URL-адреса, потім схеми, потім нарешті ініціалізувати додаток із схемами та URL-адресами для різних об'єктів даних. Коли користувач орієнтується у програмі, об'єкти даних завантажуються, перевіряються у відповідності зі схемою та відображаються. Оскільки користувачі CRUD визначають дані, схеми забезпечують перевірку першого проходження.
У мене проблема з ініціалізацією. Я використовую виклик Ajax для отримання кореневого об'єкта $ .when (), а потім створюю масив обіцянок, по одному для кожного об'єкта схеми. Це працює. Я бачу підбір в консолі.
Потім я бачу доступ до всіх схем, тому кожен виклик $ .ajax () працює. fetchschemas () дійсно повертає масив обіцянок.
Однак той фінальний момент, коли () пункт ніколи не запускається, а слово "Зроблено" ніколи не з’являється на консолі. Вихідний код до 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);
});
});