10

進行中の遅延コールバック キューをキャンセルする方法はありますか? 任意の量の ajax 呼び出しがあります。成功のデータが特定のマーカーを返すときに、それ以上の ajax リクエストを停止したい:

this.oDeferred=$.Deferred();
this.oChain=this.oDeferred;

for(var i=0; i<this.aKey.length; i++) {
    (function(iKey,self) {
        self.oChain=self.oChain.then(function(){
            return $.ajax({
                url:self.aUrl[iKey],
                type:'post',
                data:{'ajax':true},
                dataType:'json',
                success:function(data) {
                    if(data.bCancel==true) {
                        //stop deferred object here!
                    }
                }
            });
        })
    }(this.aKey[i],this))
}

this.oDeferred.done(function() {
    console.log('done')
});
this.oDeferred.resolve()

ちなみに、関数 done() は、すべての ajax リクエストが行われた後に自律的に起動されます。すべてのajaxリクエストが完了した後に関数を実行する方法は?

前もって感謝します!

4

2 に答える 2

8

答えはイエスです。2 つのアプローチが可能です。

。それから()

メソッドは新しい promise を返します。.then()その状態は、メソッドに渡されたハンドラーから返されたものによって決定されます。

  • Promise ではない値/オブジェクトを返すことにより、元の Promise と同じ解決済み/拒否されたステータスを持つ新しい Promise がメソッド チェーンに渡されますが、返された値/オブジェクトで解決/拒否されます。
  • Promise を返すことにより、その Promise は元の Promise から独立した状態でメソッド チェーンに渡されます。

.then()したがって、Deferred/promise コールバック キューは、ハンドラーから決して解決も拒否もされない promise を返すことによって効果的に取り消すことができます。このような promise は、.then()ハンドラーの done ハンドラー (最初の引数) またはその fail ハンドラー (2 番目の引数) から作成できます。元の Deferred/promise を変更せずに返す.done().fail()またはメソッドでは、同じことは達成できません。.always()

エラーをスローする

.then().done().fail().always()または.progress()ハンドラー内からスローされたキャッチされないエラーは、実行中のイベント スレッドを強制終了することにより、メソッド チェーンを強制終了します。

たとえば、意図的にエラーをスローすることができますthrow('deliberate error')

ノート

どちらのアプローチも、チェーンされたメソッド ハンドラー (または割り当てによって達成される同等のもの) のみを抑制することに注意してください。

どちらのアプローチでも、return/error 式の抑制が実行された時点で既に開始されている非同期プロセスは続行され、対応する done/fail/always/progress ハンドラーが既に配置されている場合は起動する可能性があります。

于 2013-05-02T22:21:53.463 に答える