As promessas, introduzidas no ES6, transformaram nossa abordagem à programação assíncrona. No entanto, há situações em que podemos precisar intervir e cancelar à força uma promessa, como no caso de cenários de pesquisa com digitação antecipada.
Em JavaScript moderno, a dura realidade é: não. Atualmente, as promessas não suportam cancelamento.
Como o cancelamento direto da promessa não é uma opção, surgiram abordagens alternativas.
Um token de cancelamento é um mecanismo que permite passar uma variável cancelável para uma função. Quando o token é chamado, ele aborta a operação e rejeita a promessa associada. Aqui está um exemplo:
function getWithCancel(url) { // token for cancellation var xhr = new XMLHttpRequest(); xhr.open("GET", url); return new Promise(function(resolve, reject) { xhr.onload = function() { resolve(xhr.responseText); }; token.cancel = function() { xhr.abort(); reject(new Error("Cancelled")); }; xhr.onerror = reject; }); }
Com esta abordagem, você pode:
var token = {}; var promise = getWithCancel("/someUrl", token); // later on: token.cancel();
Bibliotecas promissoras, "desculpe o trocadilho", como o Bluebird fornecem suporte para cancelamento de promessas, junto com outros recursos avançados.
Esse padrão garante que apenas a última invocação de uma função seja executada. Ele emprega uma abordagem de token para cancelar invocações anteriores:
function last(fn) { var lastToken = { cancel: function(){} }; return function() { lastToken.cancel(); var args = Array.prototype.slice.call(arguments); args.push(lastToken); return fn.apply(this, args); }; }
Uso:
var synced = last(getWithCancel); synced("/url1?q=a"); // canceled synced("/url1?q=ab"); // canceled synced("/url1?q=abc"); // canceled synced("/url1?q=abcd").then(function() { // only this will run });
Embora seja decepcionante que as promessas não suportem inerentemente o cancelamento, as técnicas mencionadas acima fornecem soluções alternativas viáveis. À medida que a linguagem evolui, o verdadeiro cancelamento da promessa pode se tornar uma realidade no futuro.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3