Можно ли отменить отсрочку jQuery?

У меня есть ситуация, когда я хочу отменить отложенный. Отложенный связан с вызовом 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-вызова могут быть невыполненными одновременно, мне нужно отменить предыдущий вызов, чтобы убедиться, что он не возвращается после второго и не показывает старые данные.

Решения, которые мне не нравятся

  • Я не хочу отклонять deferred, потому что это приведет к срабатыванию обработчиков, прикрепленных с помощью .fail().
  • Я не могу игнорировать его, потому что он будет автоматически помечен как решенный или отклоненный, когда ajax вернется.
  • Удаление отложенного вызова вызовет ошибку, когда вызов ajax вернется и попытается пометить отложенный вызов как разрешенный или отклоненный.

Что я должен делать?

Есть ли способ отменить отложенные или удалить любые прикрепленные обработчики?

Приветствуются советы о том, как исправить мой дизайн, но предпочтение будет отдано тому, чтобы найти способ удалить обработчики или предотвратить их срабатывание.

39
задан Bergi 3 April 2016 в 20:43
поделиться