JQuery отложен: отменить ход

Есть ли способ отменить отложенную очередь обратного вызова? У меня есть произвольное количество вызовов 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. Как выполнить функцию после выполнения всех аякс-запросов?

Заранее благодарю вас!

Ответ 1

Ответ: да. Возможны два подхода.

.then()

Метод .then() возвращает новое обещание, состояние которого определяется тем, что возвращается от обработчика (ов), переданного методу.

  • возвращая значение/объект, который не обещает, новое обещание передается по цепочке методов с тем же разрешенным/отклоненным статусом, что и исходное обещание, но разрешено/отклонено с возвращаемым значением/объектом.
  • возвращая обещание, это обещание передается по цепочке методов со статусом, который не зависит от первоначального обещания.

Таким образом, отсроченная/обезвоженная очередь обратного вызова может быть эффективно отменена, возвращая из обработчика .then() обещание, которое никогда не будет разрешено и никогда не будет отклонено. Такое обещание можно сделать из обработчика обработчика .then() (первый аргумент) или его обработчика отказа (второй аргумент). То же самое не может быть достигнуто с помощью методов .done(), .fail() или .always(), которые возвращают оригинал Deferred/prom без изменений.

Выбросить ошибку

Невыпущенная ошибка, возникающая из обработчика .then(), .done(), .fail(), .always() или .progress(), убьет цепочку методов, убив поток событий, в котором он запущен.

Ошибка может быть вызвана намеренно, например, throw('deliberate error').

Примечание

Следует отметить, что оба подхода будут только подавлять обработчики связанных цепочек (или эквивалент, достигнутый назначением).

При любом подходе любой асинхронный процесс, который уже запущен в точке, где выполняется подавление выражения return/error, будет продолжаться, и любой соответствующий обработчик done/fail/always/progress уже может быть запущен.

Ответ 2

Чтение через документы jQuery, похоже, не встроенный метод, чтобы делать то, что вы хотите. Существует плагин, который может получить вас там, где вам нужно называться jQuery-timing. Этот поток также может иметь отношение к вам Отмена отложенного обещания в jQuery.