特定の順序でデータを読み込む必要があるアプリケーションがあります。ルート URL、スキーマ、そして最後にさまざまなデータ オブジェクトのスキーマと URL を使用してアプリケーションを初期化します。ユーザーがアプリケーション内を移動すると、データ オブジェクトが読み込まれ、スキーマに対して検証されて表示されます。ユーザーがデータを CRUD すると、スキーマによってファースト パス検証が行われます。
初期化に問題があります。Ajax 呼び出しを使用してルート オブジェクト $.when() を取得し、各スキーマ オブジェクトごとに 1 つずつ、promise の配列を作成します。これでうまくいきました。コンソールにフェッチが表示されます。
次に、すべてのスキーマのフェッチを確認すると、各 $.ajax() 呼び出しが機能します。fetchschemas() は確かに promise の配列を返します。
ただし、最後の when() 句は実行されず、コンソールに「DONE」という単語は表示されません。jquery-1.5 のソース コードでは、オブジェクトが渡されない場合、when() はリストを管理するために内部の Deferred() オブジェクトを構築するため、$.when.apply() に渡すオブジェクトとして「null」が許容されることが示唆されているようです。
これは 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);
});
});
ベストアンサー1
あなたが探しています
$.when.apply($, promises).then(function(schemas) {
console.log("DONE", this, schemas);
}, function(e) {
console.log("My ajax failed");
});
これも機能します (一部の作業では、壊れた Ajax は修正されません)。
$.when.apply($, promises).done(function() { ... }).fail(function() { ... });`
内部がを参照するよう$
に、null
の代わりに を渡す必要があります。ソースにとっては問題にならないはずですが、 を渡すよりはましです。this
$.when
jQuery
null
$.ajaxをすべて置き換えて$.when
サンプルをモックアップします作品
したがって、これは Ajax リクエストの問題か、fetch_schemas に渡す配列の問題のいずれかです。