Можно ли создать и использовать отложенный объект напрямую с помощью AJAX?

StackOverflow https://stackoverflow.com//questions/23015726

Вопрос

У меня есть приложение, которое отправляет несколько запросов 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().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top