У меня есть ситуация, когда я хочу отменить отложенную. Отложенная связь связана с вызовом ajax.
Почему я использую отложенные
Я не использую обычные объекты xhr, возвращаемые $.ajax. Я использую 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;
}
Почему я хочу отменить отложенную
Существует поле ввода, которое служит фильтром для списка и автоматически обновляет список через полсекунды после ввода концов. Поскольку два вызова ajax могут быть выдающимися одновременно, мне нужно отменить предыдущий вызов, чтобы он не возвращался после второго и отображал старые данные.
Решения, которые мне не нравятся
- Я не хочу отклонять отложенное, потому что это приведет к срабатыванию обработчиков с помощью
.fail()
. - Я не могу игнорировать его, потому что он автоматически будет отмечен как разрешенный или отклоненный при возврате ajax.
- Удаление отложенного приведет к ошибке при возврате вызова ajax и пытается пометить отложенное как разрешенное или отклоненное.
Что мне делать?
Есть ли способ отменить отложенные или удалить все прикрепленные обработчики?
Совет о том, как исправить мой дизайн, приветствуется, но предпочтение будет отдаваться поиску способа удаления обработчиков или предотвращения их стрельбы.