1. ホーム
  2. jquery

[解決済み] jQuery Deferredsの配列はどのように扱うのですか?重複

2022-06-28 16:46:23

質問

ルート URL、スキーマ、そして最後にさまざまなデータオブジェクトのスキーマと URL でアプリケーションを初期化する、という順序でデータを読み込む必要があるアプリケーションを持っています。 ユーザがアプリケーションをナビゲートすると、データオブジェクトが読み込まれ、スキーマに対して検証され、表示されます。 ユーザがデータをCRUDするとき、スキーマはファーストパスの検証を提供します。

初期化で問題が発生しました。 私はルートオブジェクト、$.when()を取得するためにAjaxコールを使用し、次に各スキーマオブジェクトのために1つの約束の配列を作成します。 それは動作します。 私はコンソールでフェッチを見ます。

それから私はすべてのスキーマのためのフェッチを見るので、各$.ajax()呼び出しは動作します。 fetchschemas()は確かに約束の配列を返します。

しかし、その最後のwhen()句は決して発射されず、コンソールに"DONE"という単語は決して表示されません。jquery-1.5 のソースコードでは、$.when.apply() に渡すオブジェクトとして "null" が受け入れられることを示唆しているようですが、これは 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);
        });
    });

どのように解決するのですか?

あなたが探しているのは

$.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に渡す配列に問題があるということです。