É possível criar e usar um objeto Adiada diretamente com AJAX?
-
21-12-2019 - |
Pergunta
Eu tenho uma aplicação que envia algumas solicitações AJAX quando um usuário clica em um botão específico.
No entanto, eu também tenho algo semelhante a um 'Cancelar' botão, o qual deve cancelar todos os pedidos.
Eu estou usando $.when
atualmente para lidar com todos os pedidos enviados, com os devidos retornos de chamada adicionado para o Promise
objeto que ele retorna.
No entanto, o fato de que $.when
retorna um Promise
objeto é frustrante, como não (deliberadamente) incluem os métodos Deferred
tem para controlar os pedidos, tal como é apresentado com este código:
Usando $.quando
var x = $.when($.get('/'), $.get('/')); // .then(function() {console.log('done');});
Object.keys(x);
// ["state", "always", "then", "promise", "pipe", "done", "fail", "progress"]
Usando uma solicitação AJAX (jqXHR implementa o Diferidos interface)
var x = $.get('/');
Object.keys(x);
// ["readyState", "getResponseHeader", "getAllResponseHeaders", "setRequestHeader", "overrideMimeType", "statusCode", "abort", "state", "always", "then", "promise", "pipe", "done", "fail", "progress", "complete", "success", "error"]
Eu estou procurando uma maneira de recuperar o Deferred
objeto, ou substituir $.when
com um método que executa a mesma, mas retorna uma Deferred
objeto em vez disso.A partir daí, eu vou ser capaz de chamar um adequado de rejeição / anulação método.
Isso é possível?
Solução
Você pode colocar os pedidos em um array e anular-lhes, individualmente, quando necessário.
Para isso, você pode usar .apply
no $.when
.Por exemplo:
var requests = [$.get('/'), $.get('/')];
$.when.apply($,requests).then(function(res1,res2){
//access results here
});
// aborting:
requests.forEach(function(x){ return x.abort();});
Diferidos objetos são usados somente para criar promessas de retorno de chamada de APIs.Você não pode "recuperar" o objeto adiada de um já existente promessa.Apenas criar novas com ele.
Você também pode querer olhar em Domenic last()
.