1

私は返すことができる{status: ok}、または{status: error}他のデータと一緒に ajax 呼び出しを行っています。

.then(doneFilter)メンバーをチェックしてstatusから、ステータスが OK の場合にのみ Deferred が解決されるように変更したいと思います。

その構文がわかりません。誰かが私に例を書いてもらえますか?

4

2 に答える 2

2

典型的な例を次に示します。

/*  Returns a deferred object.  It is resolved if the ajax call succeeded, and
    is rejected otherwise.
*/
function doAjaxThing() {
    var df = $.Deferred();
    $.ajax('http://someurl.org/path/whatever').done( function(data) {
        if('test for success here')
            df.resolve();
        else
            df.reject();
    }).fail( function() {
        df.reject();
    });

    return df;  
}

doAjaxThing().then( 
    function() { 'success!'; },
    function() { 'failure.'; }
);

成功事例だけでなく、失敗事例にも対応することが重要です。また、ajax 呼び出しが失敗する可能性のある 2 つの方法があります。リクエストが返される{status: error}か、何らかのサーバー エラーが原因でリクエスト自体が失敗するかのいずれかです。

他のオプションも利用できます。解決/拒否呼び出しからハンドラーにデータを渡すことができます。acceptWith()andを使用しrejectWith()て、コンテキスト (thisオブジェクト) をハンドラーに渡すこともできます。

遅延オブジェクトのドキュメントをまだ読んでいない場合は、読むことをお勧めします。

于 2013-01-30T17:14:37.047 に答える
1

戻り状態に基づいてさまざまなコールバックをトリガーするために、ajax deferred 自体を変更したいと思います。Promiseオブジェクトは一度しか解決できないため、できません。この例を見てください:

var fai = $.Deferred();
fai.then(function () {
    fai.reject();
    console.log(fai.state());
}).done(function () {
    console.log(fai.state()); 
});
fai.resove();

http://jsfiddle.net/ExplosionPIlls/QreYY/

イベントのチェーンは を呼び出し.resolve、次に.thenコールバックです。 .thenを呼び出します.reject。ただし、これを実行すると、.reject呼び出し後の状態がまだ「解決済み」であり.doneコールバックがトリガーされることがわかります。

つまり、 ajax リクエストが成功した場合、それはすでに.resolved状態に設定されており、元に戻すことはできません。

代わりに、次のようなことを行うことができます。とにかく簡単だと思います。

$.ajax(...).done(function (json) {
   if (json && json.status == 'ok') {
      //handle success right here
   }
   else {
      //handle failure right here
   }
});
于 2013-01-30T17:27:55.490 に答える