So fügen Sie in JS eine Abbruchfunktion zu einem Versprechen hinzu

So fügen Sie in JS eine Abbruchfunktion zu einem Versprechen hinzu

Überblick

Versprechen haben nur drei Zustände: ausstehend, gelöst und abgelehnt. Sobald ein asynchrones Versprechen ausgegeben wurde, kann es nach dem Warten (ausstehend) am Ende nur erfolgreich sein oder fehlschlagen und kann nicht zwischendurch abgebrochen (abgebrochen) werden.

Es gibt zwei Möglichkeiten, eine Abbruchfunktionalität für Promises bereitzustellen:

  • Abbruch manuell durchführen. Nach dem Auslösen des Abbruchs werden die asynchron zurückgegebenen Daten direkt verworfen (manuelle Durchführung ist relativ sicher)
  • Verwenden Sie die native Methode AbortController, um die Anforderung zu unterbrechen (experimentelle Methode, kompatibel, wird vom IE nicht unterstützt).

Es gibt zwei Modi für die manuelle Implementierung der Abbruchmethode: Beide verlassen sich auf die Promise-Schnittstelle, um sie indirekt zu implementieren.

Promise Race Methode

let PromiseWithAbort = Funktion(Versprechen){
    lass _abort = null;
    lass Pabort = neues Versprechen((res,rej)=>{
      _abort = Funktion(Grund ='abbrechen !'){
        konsole.warnen(Grund);
        rej (Grund);
      }
    });

    lass Rennen = Promise.race([Versprechen,Pabort]);
    Rennen.abbrechen = _abbrechen;
    console.log(Versprechen,Pabort);
    Rückrennen;
  }

lass p1 = neues Versprechen(res=>{
   setzeTimeout(()=>{
      res('p1 Erfolg');
   },2000)
})

Lassen Sie testP = PromiseWithAbort(p1);

testP.dann(res=>{
  console.log('Erfolg:',res);
},Fehler=>{
  console.log('Fehler:',Fehler);
})

testP.abort();

// Ergebnis: Ablehnen: Abbrechen!

Versprechen neu verpacken

Klasse PromiseWithAbort {
    Konstruktor(fn){
      lass _abort = null;
      lass _p = neues Versprechen((res,rej)=>{
        fn.call(null,res,rej);
        _abort = Funktion(Fehler='abort'){ rej(Fehler); }
      })

      _p.abort = _abort;
      gibt _p zurück;
    }
  } 


lass testP = neues PromiseWithAbort((res,rej)=>{
    setzeTimeout(() => {
      Ergebnis(1);
    },1000);
  });

 testP.dann(r=>{
    Konsole.log('res:',r);
  },r=>{
    Konsole.log('rej:',r);
  });

  testP.abort();
//Ergebnis: rej: Abbruch

AbortController

(Dies ist eine experimentelle Funktion der DOM-Spezifikation, und in einigen Browsern befindet sie sich noch in der Entwicklung.) Die Schnittstelle AbortController stellt ein Controllerobjekt dar, mit dem Sie bei Bedarf eine oder mehrere DOM-Anfragen abbrechen können.

// Abrufanforderung unterbrechen let controller = new AbortController();
  lass signal = controller.signal;

 holen('https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally',{signal}).dann(r=>{
    konsole.log(r);
  });

  controller.abort();
// Ergebnis: Nicht abgefangene (im Versprechen) DOMException: Der Benutzer hat eine Anfrage abgebrochen.
//Ein Versprechen unterbrechen
Klasse PromiseWithAbortController {
  Konstruktor(fn,{signal}){
    wenn (Signal && Signal.abgebrochen) {
      return Promise.reject(neue DOMException('Abgebrochen','AbortError'));
    }

    let _p = neues Versprechen((lösen,ablehnen)=>{
      fn.call(null,auflösen,ablehnen);
      wenn(Signal){
        signal.addEventListener('abbrechen',()=>{
          ablehnen(neue DOMException('Abgebrochen','Abbruchfehler'));
        })
      }
    });

    gibt _p zurück;
  }
}
let controller = neuer AbortController();
  lass signal = controller.signal;
lass testP2 = neuer PromiseWithAbortController((r,j)=>{
  setzeTimeout(() => {
    r('Erfolg');
  }, 1000);
},{Signal});

testP2.then(r=>{
    Konsole.log('res:',r);
  },r=>{
    Konsole.log('rej:',r);
  });

  controller.abort();
  // Ergebnis: rej: DOMException: Abgebrochen

Axios-Plugin verfügt über eine Abbruchfunktion

//1. Quelltoken verwenden
const CancelToken = axios.CancelToken;
const Quelle = CancelToken.source();

axios.get('/Benutzer/12345', {
  cancelToken: Quelle.Token
}).catch(Funktion (geworfen) {
  wenn (axios.isCancel(geworfen)) {
    console.log('Anfrage abgebrochen', thrown.message);
  } anders {
    // Fehler behandeln
  }
});

axios.post('/Benutzer/12345', {
  Name: „Neuer Name“
}, {
  cancelToken: Quelle.Token
})

// Anfrage abbrechen (der Nachrichtenparameter ist optional)
source.cancel('Vorgang vom Benutzer abgebrochen.');

//2. Durch die ausgehende Funktion
const CancelToken = axios.CancelToken;
abbrechen lassen;

axios.get('/Benutzer/12345', {
  cancelToken: neues CancelToken(Funktion Executor(c) {
    // Eine Executor-Funktion erhält eine Abbruchfunktion als Parameter
    abbrechen = c;
  })
});

// die Anfrage abbrechen
stornieren();

//Main: Anfragen mit demselben Token können gemeinsam storniert werden

Axios wird in aktuellen Projekten am häufigsten verwendet. Machen Sie sich also keine Sorgen, wenn Sie die Anfrage stornieren. Der DOM-spezifizierte AbortController wird aus Kompatibilitätsgründen nicht empfohlen. Wenn Sie es selbst implementieren müssen, sind die ersten beiden Methoden im Artikel sicherer (Promise-Race-Methode und Repackage-Promise-Methode).

Oben finden Sie Einzelheiten dazu, wie JS Promises eine Abbruchfunktion hinzufügt. Weitere Informationen zu JS finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Ein tiefer Einblick in JavaScript-Promises
  • Detaillierte Erklärung von Promises in JavaScript
  • Front-End-JavaScript-Versprechen
  • Fragen zum Vorstellungsgespräch zu JS 9 Promise
  • Verstehen Sie das Versprechen von JavaScript gründlich

<<:  Implementierungsmethode und Beispielcode des Tomcat-Klassenladers

>>:  Detaillierte grafische Erklärung zur Installation und vollständigen Löschung von MySQL durch Dekomprimierung

Artikel empfehlen

Eine kurze Diskussion über JS-Verpackungsobjekte

Inhaltsverzeichnis Überblick Definition Instanzme...

So zeichnen Sie in CocosCreator ein cooles Radardiagramm

Inhaltsverzeichnis Vorwort Vorschau Text Grafikko...

Vollständige Schritte zum Bereitstellen von Confluence mit Docker

Confluence ist kostenpflichtig, kann aber für die...

Gemeinsame Nutzung verschiedener Methoden zum Deaktivieren des Seitencaches

Heute bin ich beim Entwickeln auf eine Methode ge...

Beispiele für die Verwendung von Docker und Docker-Compose

Docker ist eine Open-Source-Container-Engine, mit...

MySQL 8.0.20 Installations-Tutorial mit Bildern und Text (Windows 64-Bit)

1: Download von der offiziellen MySQL-Website htt...

So implementieren Sie eine geplante Sicherung der CentOS MySQL-Datenbank

Das folgende Skript wird für die geplante Sicheru...

Zusammenfassung häufig verwendeter Escape-Zeichen in HTML

Die in HTML häufig verwendeten Escape-Zeichen wer...