Mam aplikację, która wymaga załadowania danych w określonej kolejności: główny adres URL, następnie schematy, a na końcu zainicjuj aplikację ze schematami i adresami URL dla różnych obiektów danych. Gdy użytkownik nawiguje po aplikacji, obiekty danych są ładowane, sprawdzane względem schematu i wyświetlane. Gdy użytkownik CRUD dane, schematy zapewniają walidację pierwszego przejścia.
Mam problem z inicjalizacją. Używam wywołania Ajax, aby pobrać obiekt główny, $ .when (), a następnie tworzę tablicę obietnic, po jednej dla każdego obiektu schematu. To działa. Widzę pobieranie w konsoli.
Następnie widzę pobieranie dla wszystkich schematów, więc każde wywołanie $ .ajax () działa. fetchschemas () rzeczywiście zwraca tablicę obietnic.
Jednak ta ostatnia klauzula when () nigdy nie jest uruchamiana, a słowo „DONE” nigdy nie pojawia się na konsoli. Kod źródłowy jquery-1.5 wydaje się sugerować, że "null" jest akceptowalne jako obiekt do przekazania do $ .when.apply (), ponieważ when () zbuduje wewnętrzny obiekt Deferred () do zarządzania listą, jeśli żaden obiekt nie jest przeszedł.
To działało przy użyciu Futures.js. Jak należy zarządzać tablicą jQuery Deferreds, jeśli nie w ten sposób?
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);
});
});