Ich habe eine Anwendung, bei der Daten in einer bestimmten Reihenfolge geladen werden müssen: die Stamm-URL, dann die Schemas und schließlich die Anwendung mit den Schemas und URLs für die verschiedenen Datenobjekte initialisieren. Während der Benutzer durch die Anwendung navigiert, werden Datenobjekte geladen, anhand des Schemas überprüft und angezeigt. Während der Benutzer die Daten CRUDs, bieten die Schemas eine First-Pass-Validierung.
Ich habe ein Problem mit der Initialisierung. Ich verwende einen Ajax-Aufruf, um das Stammobjekt $ .when () abzurufen und dann ein Array von Versprechungen zu erstellen, eines für jedes Schemaobjekt. Das funktioniert. Ich sehe den Abruf in der Konsole.
Ich sehe dann den Abruf für alle Schemas, so dass jeder Aufruf von $ .ajax () funktioniert. fetchschemas () gibt tatsächlich eine Reihe von Versprechungen zurück.
Diese letzte when () -Klausel wird jedoch niemals ausgelöst und das Wort "DONE" wird niemals auf der Konsole angezeigt. Der Quellcode für jquery-1.5 scheint zu implizieren, dass "null" als Objekt akzeptabel ist, das an $ .when.apply () übergeben werden soll, da wenn () ein internes Deferred () -Objekt erstellt, um die Liste zu verwalten, wenn kein Objekt vorhanden ist übergeben.
Dies funktionierte mit Futures.js. Wie sollte ein Array von jQuery Deferreds verwaltet werden, wenn dies nicht der Fall ist?
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);
});
});