1

カスタム遅延オブジェクトを使用して、いくつかのコールバックを管理しようとしています。簡単なケースを見つけました:

var deferred = $.Deferred();

deferred.done(function() {
    console.log( 'done' );
});

var json = $.getJSON('/foo');

json.then(
    function() {
        deferred.resolveWith(this, arguments);
    }  
);

しかし、解決/拒否する前に応答を検査する必要があります。次のようなものを追加したいと思います。

deferred.pipe(
    function(response) {
        if (response.message === 'error') {
            return $.Deferred.reject(response);
        }
        return response;
    }
);

しかし、そうすると、元のdone()コールバックは関係なく常に呼び出されます。deferred.resolveWith()それは、電話をかけてから「ロールバック」して後で拒否としてマークするには遅すぎるからだと確信しています。条件を の最初の引数に移動できることはわかっていますがjson.then()、それは遅延オブジェクトのポイントを見逃しているようです。

deferred条件付きとコールバックの両方を他の場所で解決しながら入れることは可能ですか?

4

1 に答える 1

3

あなたの目標は、機能を2つのステップに分離することだけであるように思われます.ajaxリクエストの結果を検証し、結果を処理します。これを行うには、外側の deferred を、ajax リクエストによって返されたパラメーターに基づいて解決または拒否する内側の deferred に置き換えます。

var deferred = $.Deferred();

deferred.then(function(data){
    // new deferred that we will be returning
    var deferred = $.Deferred();
    if (data.success == true) {
        deferred.resolveWith(data.result);
    }
    else {
        deferred.rejectWith(data.error);
    }
    // any following chained methods will affect this returned deferred object
    return deferred;
}).then(
    // done callback
    function(result){
        console.log("Resolved!");
        console.dir(result);
    },
    // fail callback
    function(error){
        console.log("Rejected!");
        console.dir(error)
    }
);

var json = $.getJSON("/foo");
json.done(deferred.resolveWith);
于 2013-02-27T18:09:15.050 に答える