データを特定の順序でロードする必要があるアプリケーションがあります。ルートURL、スキーマ、最後にさまざまなデータオブジェクトのスキーマとURLでアプリケーションを初期化します。ユーザーがアプリケーションをナビゲートすると、データオブジェクトが読み込まれ、スキーマに対して検証され、表示されます。ユーザーがデータをCRUDすると、スキーマは初回通過検証を提供します。
初期化に問題があります。Ajax呼び出しを使用してルートオブジェクト$.when()をフェッチし、スキーマオブジェクトごとに1つずつpromiseの配列を作成します。それはうまくいきます。コンソールにフェッチが表示されます。
次に、すべてのスキーマのフェッチが表示されるので、各$ .ajax()呼び出しが機能します。fetchschemas()は確かにpromiseの配列を返します。
ただし、その最後のwhen()句は起動せず、「DONE」という単語がコンソールに表示されることはありません。jquery-1.5のソースコードは、「null」が$ .when.apply()に渡すオブジェクトとして受け入れられることを意味しているようです。これは、when()が内部Deferred()オブジェクトを構築して、オブジェクトがない場合にリストを管理するためです。渡されました。
これはFutures.jsを使用して機能しました。このようになっていない場合、jQuery Deferredの配列をどのように管理する必要がありますか?
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);
});
});