Maison >interface Web >js tutoriel >Pouvons-nous annuler de force les promesses en JavaScript ?

Pouvons-nous annuler de force les promesses en JavaScript ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 15:09:03415parcourir

 Can We Forcefully Cancel Promises in JavaScript?

Promesses : pouvons-nous vraiment forcer l'annulation ?

Les promesses, introduites dans ES6, ont transformé notre approche de la programmation asynchrone. Cependant, il existe des situations dans lesquelles nous pouvons être amenés à intervenir et à annuler de force une promesse, comme dans le cas de scénarios de recherche par saisie anticipée.

Alors, pouvons-nous annuler une promesse ?

Dans JavaScript moderne, la dure réalité est : non. Les promesses ne prennent actuellement pas en charge l'annulation.

Que pouvons-nous faire à la place ?

L'annulation directe d'une promesse n'étant pas une option, des approches alternatives ont émergé.

Utilisez un jeton d'annulation

Un jeton d'annulation est un mécanisme qui vous permet de passer une variable annulable dans une fonction. Lorsque le jeton est appelé, il abandonne l'opération et rejette la promesse associée. Voici un exemple :

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;
  });
}

Avec cette approche, vous pouvez :

var token = {};
var promise = getWithCancel("/someUrl", token);

// later on:
token.cancel();

Utiliser une bibliothèque tierce

Prometteuse, "excusez le jeu de mots", bibliothèques comme Bluebird, prennent en charge l'annulation des promesses, ainsi que d'autres fonctionnalités avancées.

Adopter un modèle de dernier appel

Ce modèle garantit que seule la dernière invocation d'une fonction s'exécute. Il utilise une approche symbolique pour annuler les invocations précédentes :

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);
  };
}

Utilisation :

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
});

Conclusion

Bien qu'il soit décevant que les promesses ne prennent pas intrinsèquement en charge l'annulation, ce qui précède Les techniques fournissent des solutions de contournement viables. À mesure que le langage évolue, la véritable annulation des promesses pourrait devenir une réalité dans le futur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn