У меня есть приложение, которое требует загрузки данных в определенном порядке: корневой URL, затем схемы, и, наконец, инициализация приложения со схемами и URL-адресами для различных объектов данных. Когда пользователь перемещается по приложению, объекты данных загружаются, проверяются на соответствие схеме и отображаются. Когда пользователь CRUD обрабатывает данные, схемы обеспечивают проверку первого прохода.
У меня проблема с инициализацией. Я использую Ajax-вызов для извлечения корневого объекта $ .when (), а затем создаю массив обещаний, по одному для каждого объекта схемы. Это работает. Я вижу выборку в консоли.
Затем я вижу выборку для всех схем, поэтому каждый вызов $ .ajax () работает. fetchschemas () действительно возвращает массив обещаний.
Однако это предложение final () никогда не срабатывает, и слово «DONE» никогда не появляется на консоли. Исходный код jquery-1.5, по-видимому, подразумевает, что «null» является приемлемым в качестве объекта для передачи в $ .when.apply (), так как when () создаст внутренний объект 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);
});
});