据え置きをキャンセルしたい状況があります。deferred は ajax 呼び出しに関連付けられています。
deferred を使用する理由
$.ajax によって返される通常の xhr オブジェクトは使用しません。私は jsonp を使用しています。つまり、エラー処理に HTTP ステータス コードを使用できず、それらを応答に埋め込む必要があります。その後、コードが検査され、関連付けられた遅延オブジェクトが解決済みまたは拒否済みとしてマークされます。これを行うカスタム API 関数があります。
function api(options) {
var url = settings('api') + options.url;
var deferred = $.Deferred(function(){
this.done(options.success);
this.fail(options.error);
});
$.ajax({
'url': url,
'dataType':'jsonp',
'data': (options.noAuth == true) ? options.data : $.extend(true, getAPICredentials(), options.data)
}).success(function(jsonReturn){
// Success
if(hasStatus(jsonReturn, 'code', 200)) {
deferred.resolveWith(this, [jsonReturn]);
}
// Failure
else {
deferred.rejectWith(this, [jsonReturn]);
}
});
return deferred;
}
延期をキャンセルしたい理由
リストのフィルターとして機能する入力フィールドがあり、入力が終了してから 0.5 秒後にリストが自動的に更新されます。一度に 2 つの ajax 呼び出しが未処理になる可能性があるため、前の呼び出しをキャンセルして、2 回目以降に返されず、古いデータが表示されないようにする必要があります。
気に入らない解決策
- で添付されたハンドラが起動するため、遅延を拒否したくありません
.fail()
。 - ajaxが戻ったときに自動的に解決済みまたは拒否済みとしてマークされるため、無視できません。
- 遅延オブジェクトを削除すると、ajax 呼び出しが戻り、遅延オブジェクトを解決済みまたは拒否済みとしてマークしようとすると、エラーが発生します。
私は何をすべきか?
遅延をキャンセルしたり、添付されたハンドラーを削除したりする方法はありますか?
設計を修正する方法についてのアドバイスは大歓迎ですが、ハンドラーを削除する方法や、ハンドラーが起動しないようにする方法を見つけることが優先されます。