Можно ли создать и использовать отложенный объект напрямую с помощью AJAX?
-
21-12-2019 - |
Вопрос
У меня есть приложение, которое отправляет несколько запросов AJAX, когда пользователь нажимает определенную кнопку.
Однако у меня также есть что-то похожее на кнопку «Отмена», которая должна отменять все запросы.
я использую $.when
в настоящее время для обработки всех отправленных запросов с добавлением соответствующих обратных вызовов в Promise
объект, который он возвращает.
Однако тот факт, что $.when
возвращает Promise
объект разочаровывает, поскольку он (намеренно) не включает методы Deferred
должен контролировать запросы, как показано в этом коде:
Использование $.when
var x = $.when($.get('/'), $.get('/')); // .then(function() {console.log('done');});
Object.keys(x);
// ["state", "always", "then", "promise", "pipe", "done", "fail", "progress"]
Использование одного запроса AJAX (jqXHR реализует интерфейс Deferred)
var x = $.get('/');
Object.keys(x);
// ["readyState", "getResponseHeader", "getAllResponseHeaders", "setRequestHeader", "overrideMimeType", "statusCode", "abort", "state", "always", "then", "promise", "pipe", "done", "fail", "progress", "complete", "success", "error"]
Я ищу способ получить Deferred
объект или заменить $.when
с методом, который выполняет то же самое, но возвращает Deferred
вместо этого объект.Оттуда я смогу вызвать подходящий метод отклонения/прерывания.
Это возможно?
Решение
Вы можете поместить запросы в массив и при необходимости прерывать их по отдельности.
Для этого вы можете использовать .apply
на $.when
.Например:
var requests = [$.get('/'), $.get('/')];
$.when.apply($,requests).then(function(res1,res2){
//access results here
});
// aborting:
requests.forEach(function(x){ return x.abort();});
Отложенные объекты используются только для создания обещаний из API обратного вызова.Вы не можете «получить» отложенный объект уже существующего обещания.Только создавайте новые, используя его.
Вы также можете заглянуть в Доменика. last()
.