3

私の AJAX 要求は、実際に処理を進める前に非同期処理に依存しているため、jQuery AJAX メソッドのラッパーを作成しています。

私が現在行っているのはこれです: http://pastie.org/private/bfdvep4kcdclzupsyddmiq

var ajax = function (options) {
    var deferred = $.Deferred();

    doAsyncWork()
    .done(function (attributes) {
        $.ajax(options)
        .done(function () {
            deferred.resolve.apply(this, arguments);
        })
        .fail(function () {
            deferred.reject.apply(this, arguments);
        });
    })
    .fail(function () {
        deferred.reject();
    });

    return deferred.promise();
};

ajax().readyState // undefined

promise を返す外部 deferred があります。doAsyncWork() を起動し、実際に AJAX リクエストを実行する前に完了するのを待ちます。さて、これは機能しますが、問題は、他のスクリプトが jQuery XHR オブジェクトのプロパティにアクセスできないためにラッパーを使用する場合です。

これをエレガントに解決する方法はありますか?

4

2 に答える 2

2

問題は、なぜそうすべきなのかということです。$.ajax()ラッパーで透過的に置き換えようとしていますか? のすべてのプロパティとメソッドを考慮する必要があるため、これはすぐに複雑になりますjqXHR

理論的には、このようなことは可能ですが、私はそれをエレガントとは呼びませんし、お勧めしません:

var ajax = function (options) {
    var deferred = $.Deferred();
    var promise = deferred.promise();

    doAsyncWork()
    .done(function (attributes) {
        $.ajax(options)
        .done(function () {
            promise.readyState = 4
            deferred.resolve.apply(this, arguments);
        })
        .fail(function () {
            promise.readyState = 4
            deferred.reject.apply(this, arguments);
        });
    })
    .fail(function () {
        deferred.reject();
    });

    promise.readyState = 0;
    return promise;
};

他の readystate 設定は、適切なコールバックに移動する必要があります ( onreadystatechangeJQuery にはありません)。

それで、代わりに何をしますか?

他のスクリプトがラッパーを使用したい場合は、Deferred API を使用する必要があります。何らかの理由でjqXHRオブジェクトへのアクセスが本当に必要な場合は、次のように指定できます。

var ajax = function (options, xhrReadyCallback) {
    var deferred = $.Deferred();

    doAsyncWork()
    .done(function (attributes) {
        var xhr = $.ajax(options)
        .done(function () {
            deferred.resolve.apply(this, arguments);
        })
        .fail(function () {
            deferred.reject.apply(this, arguments);
        });
        xhrReadyCallback(xhr);
    })
    .fail(function () {
        deferred.reject();
    });

    return deferred.promise();
};

使用法:

ajax(options, function(xhr) {
    // now available:
    xhr.readyState;
});
于 2013-02-07T14:01:24.030 に答える
0

jqXHRオブジェクトは関数が戻るまでに作成されないため、直接渡す方法はありません。

ただし、jqXHRはdone、コールバックとコールバックの両方で、failそれぞれ3番目と1番目のパラメーターとして使用できることを忘れないでください。

于 2013-02-07T14:53:12.787 に答える