Heim Web-Frontend js-Tutorial So verwalten Sie mehrere Versprechen gleichzeitig mit Promise.all()

So verwalten Sie mehrere Versprechen gleichzeitig mit Promise.all()

Nov 09, 2024 am 05:33 AM

Asynchrone Programmierung in JavaScript ermöglicht die Ausführung ressourcenintensiver Vorgänge im Hintergrund, ohne den Hauptthread zu unterbrechen. Vorgänge wie API-Aufrufe und Dateiprozesse gehören zu den Vorgängen, die asynchron ausgeführt werden sollten.

Versprechen. all() ist eine leistungsstarke Funktion, die diese Vorgänge gleichzeitig verwalten kann. In diesem Artikel erfahren Sie, wie Sie mit Promise.all()

mehrere Versprechen gleichzeitig verwalten

Lass uns eintauchen.

Was ist ein Versprechen?

Ein Versprechen ist ein Objekt, das den eventuellen Misserfolg oder Abschluss eines asynchronen Ereignisses darstellt. Schauen wir uns ein einfaches Versprechen an.

const userId = 1;
let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (userId === 1) {
      resolve({ name: "John Doe", email: "john@example.com" });
    } else {
      reject(new Error("User not found"));
    }
  }, 1000);
});
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Ein Versprechen benötigt eine Funktion mit zwei Parametern: auflösen und ablehnen. In unserem Beispiel wird das Versprechen aufgelöst, wenn die Operation erfolgreich ist (d. h. wenn die Benutzer-ID===1 ist. Wenn die Operation fehlschlägt, wird das Versprechen abgelehnt.

Der Lebenszyklus eines Versprechens beginnt im Status „Ausstehend“ und wird schließlich entweder erfüllt oder abgelehnt. Derzeit steht die Zusage noch aus. Um das Versprechen zu nutzen, rufen wir .then() auf, um das Ergebnis zu verarbeiten.

Die Ausgabe erfolgt entweder in Form der Benutzerdaten (falls erfüllt) oder eines Fehlers (falls abgelehnt).

promise
  .then((data) => {
    console.log(data);
  })
  .catch((err) => {
    console.log(err);
  });
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Da die Operation erfolgreich ist, wird das Versprechen aufgelöst.

const userId = 1;
let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (userId === 1) {
      resolve({ name: "John Doe", email: "john@example.com" });
    } else {
      reject(new Error("User not found"));
    }
  }, 1000);
});

promise
  .then((data) => {
    console.log(data);
  })
  .catch((err) => {
    console.log(err);
  });
Nach dem Login kopieren
Nach dem Login kopieren

Wenn wir den Wert von userId ändern, wird das Versprechen abgelehnt und Sie erhalten die Fehlermeldung „Benutzer nicht gefunden“

Angenommen, Sie hätten mehrere Versprechen, würden Sie jedes Versprechen unabhängig voneinander wie folgt behandeln:

const promise1 = new Promise((resolve, reject) => resolve(1));
const promise2 = new Promise((resolve, reject) => resolve(2));
const promise3 = new Promise((resolve, reject) => resolve(3));
promise1
  .then((value) => {
    console.log(value);
    promise2
      .then((value) => {
        console.log(value);
        promise3
          .then((value) => {
            console.log(value);
          })
          .catch((err) => {
            console.log("promise3 error", err);
          });
      })
      .catch((err) => {
        console.log("promise2 error", err);
      });
  })
  .catch((err) => {
    console.log("promise1 error", err);
  });
Nach dem Login kopieren

Es gibt einige potenzielle Probleme, die sich aus der obigen Ausführung ergeben:

  • Jedes Versprechen läuft, nachdem das vorherige abgeschlossen ist. Promise2 startet, nachdem Promise1 aufgelöst wurde, und Promise3 startet, nachdem Promise2 aufgelöst wurde. Dies verlangsamt die Ausführung.

  • Die verschachtelte Struktur in der .then-Verkettung führt zur „Callback-Hölle“, was das Lesen und Warten des Codes erschwert.

  • Jeder Fehler wird unabhängig behandelt, was die Komplexität erhöht.

Ein besserer Ansatz wäre die Verwendung von Promise.all(), das die gleichzeitige Ausführung von Versprechen ermöglicht und so die Leistung und Fehlerbehandlung verbessert

Asynchrone Vorgänge mit Promise.all() verbessern

Promise.all() nimmt eine Iterable von Versprechen und gibt ein einzelnes Versprechen zurück. Die Syntax sieht so aus:

Promise.all(iterable)
Nach dem Login kopieren

Wenn wir Promise.all() in unserem früheren Beispiel verwenden, haben wir so etwas:

Promise.all([promise1, promise2, promise3])
  .then((values) => {
    console.log(values);
  })
  .catch((err) => {
    console.log("promise all error", err);
  });
Nach dem Login kopieren

Wie Sie sehen, ist dieser Ansatz sauberer und leichter zu verstehen.

JavaScript ist eine Single-Threaded-Sprache, was bedeutet, dass jeder Codeabschnitt darauf wartet, dass der vorherige abgeschlossen ist, bevor er zum nächsten übergeht.

Wenn also JavaScript Single-Threaded ist, wie geht Promise.all() mit mehreren Versprechen um?

Promise.all() arbeitet nach dem Parallelitätsprinzip, was bedeutet, dass alle Versprechen nicht unbedingt im selben Moment ausgeführt werden, sondern initiiert werden, ohne auf den Abschluss eines Versprechens zu warten, bevor mit dem nächsten begonnen wird.

Promise.all() wird nur aufgelöst, wenn alle Versprechen im Iterable erfüllt sind. Wenn jedoch eines der Versprechen im Iterable abgelehnt wird, lehnt Promise.all() sofort ab und ignoriert das Ergebnis der verbleibenden Versprechen.

Praxisbeispiele

Promise.all() eignet sich hervorragend für Szenarien, in denen Sie mehrere unabhängige asynchrone Vorgänge ausführen und warten müssen, bis alle abgeschlossen sind, bevor Sie fortfahren.

Sehen wir uns einige dieser Beispiele an, in denen Promise.all() verwendet werden kann, um die Effizienz in realen Anwendungen zu verbessern.

1.Daten von mehreren APIs abrufen

Stellen Sie sich ein Szenario vor, in dem Sie an einer Anwendung arbeiten, die gleichzeitig Daten von zwei verschiedenen APIs abruft.

Versuchen wir, die Daten nacheinander von mehreren APIs abzurufen und auch die Zeit zu protokollieren, die zum Abschließen der Anfrage benötigt wurde.

const userId = 1;
let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (userId === 1) {
      resolve({ name: "John Doe", email: "john@example.com" });
    } else {
      reject(new Error("User not found"));
    }
  }, 1000);
});
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Hier ist die Ausgabe:

How to Manage Multiple promises concurrently with Promise.all()

Die Bearbeitungszeit der Anfrage beträgt 50,36 ms. Diese Ausführungszeit kann verbessert werden. Um die Vorteile der Parallelität zu veranschaulichen, vergleichen wir den Ansatz mit Promise.all()

promise
  .then((data) => {
    console.log(data);
  })
  .catch((err) => {
    console.log(err);
  });
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Hier verwenden wir Promise.all(), um mehrere asynchrone Vorgänge gleichzeitig auszuführen. Promise.all() nimmt eine Reihe von Versprechen entgegen und gibt ein einzelnes Versprechen zurück, wenn alle Versprechen gelöst wurden.

Hier ist die Ausgabe.

How to Manage Multiple promises concurrently with Promise.all()

Anhand der Ausgabe können wir erkennen, dass die Verwendung von Promise.all() etwas effizienter ist: Diese Verbesserung tritt auf, weil Promise.all() den gleichzeitigen Start beider Vorgänge ermöglicht, anstatt darauf zu warten, dass einer abgeschlossen ist, bevor der andere gestartet wird.

In realen Anwendungen mit komplexeren Vorgängen oder zusätzlichen API-Aufrufen können die Leistungssteigerungen durch die Verwendung von Promise.all() sogar noch bedeutender sein.

Wenn Sie jedoch warten möchten, bis alle Versprechen erfüllt sind, unabhängig davon, ob sie erfüllt oder abgelehnt werden, können Sie Promise.allSettled() verwenden

  1. Senden mehrerer Datenblöcke Angenommen, Sie verfügen über eine Reihe von Textblöcken, die Kundenfeedback oder Bewertungen darstellen, und Sie müssen die Stimmung jedes Textblocks analysieren, indem Sie ihn zur Analyse an eine externe API senden.

In diesem Fall müssen alle Daten gleichzeitig gesendet werden. In diesem Fall können Sie Promise.all() verwenden und alle Anfragen gleichzeitig senden und dann warten, bis alle gelöst sind, bevor Sie die Ergebnisse erhalten.

Angenommen, wir müssten diese Beispieldaten analysieren:

const userId = 1;
let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (userId === 1) {
      resolve({ name: "John Doe", email: "john@example.com" });
    } else {
      reject(new Error("User not found"));
    }
  }, 1000);
});
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

In diesem Fall müssen alle Daten auf einmal gesendet werden; Das sequentielle Senden von Daten ist zeitaufwändig. Stattdessen verwenden wir Promise.all(), um mehrere API-Aufrufe gleichzeitig zu initiieren.

Sie werden so etwas haben:

promise
  .then((data) => {
    console.log(data);
  })
  .catch((err) => {
    console.log(err);
  });
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

3. Mehrere Dateien gleichzeitig lesen und verarbeiten.

Angenommen, Sie haben eine Anwendung, die Massen-Uploads von Benutzern akzeptiert. Nachdem Sie alle erforderlichen Maßnahmen zur Validierung der Dateien ergriffen haben, können Sie Promise.all() verwenden, um mehrere Dateilesevorgänge parallel durchzuführen. Dies ist weitaus effizienter, als jede Datei einzeln nacheinander zu lesen.

Ohne Promise.all() müssten Sie warten, bis jede Datei vollständig gelesen wurde, bevor Sie die nächste Datei lesen. Dies würde zu einer längeren Bearbeitungszeit führen, insbesondere wenn Sie eine größere Anzahl von Dateien haben.

Mit Promise.all() werden jedoch alle Dateilesevorgänge gleichzeitig initiiert, was zu einer erheblichen Zeitersparnis und einem großartigen Benutzererlebnis führt.

const userId = 1;
let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (userId === 1) {
      resolve({ name: "John Doe", email: "john@example.com" });
    } else {
      reject(new Error("User not found"));
    }
  }, 1000);
});

promise
  .then((data) => {
    console.log(data);
  })
  .catch((err) => {
    console.log(err);
  });
Nach dem Login kopieren
Nach dem Login kopieren

Es ist auch wichtig zu beachten, dass Sie beim gleichzeitigen Lesen vieler großer Dateien mögliche Speicheraspekte berücksichtigen sollten.

Zusammenfassung

Zusammenfassend lässt sich sagen, dass Promise.all() viele Vorteile bietet, die im Folgenden zusammengefasst sind

Saubererer Code: Promise.all() macht Ihren Code verständlicher, da Sie keine verschachtelten .then()-Ketten haben. Anfragen werden in einem einzigen .then()-Block verarbeitet.

Effizient: Durch das gleichzeitige Senden von Anforderungen verbessert sich die Gesamtleistung Ihrer Anwendung, da die Gesamtzeit zum Abrufen der Daten reduziert wird.

Verbessern Sie Ihr JavaScript

Erhalten Sie praktische JavaScript-Tipps und Code-Snippets in Ihrem Posteingang. Schließen Sie sich 1000 Entwicklern an, die besseren Code schreiben.

Das obige ist der detaillierte Inhalt vonSo verwalten Sie mehrere Versprechen gleichzeitig mit Promise.all(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1653
14
PHP-Tutorial
1251
29
C#-Tutorial
1224
24
Was soll ich tun, wenn ich auf den Codendruck auf Kleidungsstücke für Front-End-Thermalpapier-Quittungen stoße? Was soll ich tun, wenn ich auf den Codendruck auf Kleidungsstücke für Front-End-Thermalpapier-Quittungen stoße? Apr 04, 2025 pm 02:42 PM

Häufig gestellte Fragen und Lösungen für das Ticket-Ticket-Ticket-Ticket in Front-End im Front-End-Entwicklungsdruck ist der Ticketdruck eine häufige Voraussetzung. Viele Entwickler implementieren jedoch ...

Entmystifizieren JavaScript: Was es tut und warum es wichtig ist Entmystifizieren JavaScript: Was es tut und warum es wichtig ist Apr 09, 2025 am 12:07 AM

JavaScript ist der Eckpfeiler der modernen Webentwicklung. Zu den Hauptfunktionen gehören eine ereignisorientierte Programmierung, die Erzeugung der dynamischen Inhalte und die asynchrone Programmierung. 1) Ereignisgesteuerte Programmierung ermöglicht es Webseiten, sich dynamisch entsprechend den Benutzeroperationen zu ändern. 2) Die dynamische Inhaltsgenerierung ermöglicht die Anpassung der Seiteninhalte gemäß den Bedingungen. 3) Asynchrone Programmierung stellt sicher, dass die Benutzeroberfläche nicht blockiert ist. JavaScript wird häufig in der Webinteraktion, der einseitigen Anwendung und der serverseitigen Entwicklung verwendet, wodurch die Flexibilität der Benutzererfahrung und die plattformübergreifende Entwicklung erheblich verbessert wird.

Wer bekommt mehr Python oder JavaScript bezahlt? Wer bekommt mehr Python oder JavaScript bezahlt? Apr 04, 2025 am 12:09 AM

Es gibt kein absolutes Gehalt für Python- und JavaScript -Entwickler, je nach Fähigkeiten und Branchenbedürfnissen. 1. Python kann mehr in Datenwissenschaft und maschinellem Lernen bezahlt werden. 2. JavaScript hat eine große Nachfrage in der Entwicklung von Front-End- und Full-Stack-Entwicklung, und sein Gehalt ist auch beträchtlich. 3. Einflussfaktoren umfassen Erfahrung, geografische Standort, Unternehmensgröße und spezifische Fähigkeiten.

Wie kann man Parallax -Scrolling- und Element -Animationseffekte wie die offizielle Website von Shiseido erzielen?
oder:
Wie können wir den Animationseffekt erzielen, der von der Seite mit der Seite mit der offiziellen Website von Shiseido begleitet wird? Wie kann man Parallax -Scrolling- und Element -Animationseffekte wie die offizielle Website von Shiseido erzielen? oder: Wie können wir den Animationseffekt erzielen, der von der Seite mit der Seite mit der offiziellen Website von Shiseido begleitet wird? Apr 04, 2025 pm 05:36 PM

Diskussion über die Realisierung von Parallaxe -Scrolling- und Elementanimationseffekten in diesem Artikel wird untersuchen, wie die offizielle Website der Shiseeido -Website (https://www.shiseeido.co.jp/sb/wonderland/) ähnlich ist ...

Ist JavaScript schwer zu lernen? Ist JavaScript schwer zu lernen? Apr 03, 2025 am 12:20 AM

JavaScript zu lernen ist nicht schwierig, aber es ist schwierig. 1) Verstehen Sie grundlegende Konzepte wie Variablen, Datentypen, Funktionen usw. 2) Beherrschen Sie die asynchrone Programmierung und implementieren Sie sie durch Ereignisschleifen. 3) Verwenden Sie DOM -Operationen und versprechen Sie, asynchrone Anfragen zu bearbeiten. 4) Vermeiden Sie häufige Fehler und verwenden Sie Debugging -Techniken. 5) Die Leistung optimieren und Best Practices befolgen.

Die Entwicklung von JavaScript: Aktuelle Trends und Zukunftsaussichten Die Entwicklung von JavaScript: Aktuelle Trends und Zukunftsaussichten Apr 10, 2025 am 09:33 AM

Zu den neuesten Trends im JavaScript gehören der Aufstieg von Typenkripten, die Popularität moderner Frameworks und Bibliotheken und die Anwendung der WebAssembly. Zukunftsaussichten umfassen leistungsfähigere Typsysteme, die Entwicklung des serverseitigen JavaScript, die Erweiterung der künstlichen Intelligenz und des maschinellen Lernens sowie das Potenzial von IoT und Edge Computing.

Wie fusioniere ich Arrayelemente mit derselben ID mit JavaScript in ein Objekt? Wie fusioniere ich Arrayelemente mit derselben ID mit JavaScript in ein Objekt? Apr 04, 2025 pm 05:09 PM

Wie fusioniere ich Array -Elemente mit derselben ID in ein Objekt in JavaScript? Bei der Verarbeitung von Daten begegnen wir häufig die Notwendigkeit, dieselbe ID zu haben ...

So implementieren Sie die Funktion des Ziell- und Drop-Einstellungsfunktion, ähnlich wie bei VSCODE in der Front-End-Entwicklung? So implementieren Sie die Funktion des Ziell- und Drop-Einstellungsfunktion, ähnlich wie bei VSCODE in der Front-End-Entwicklung? Apr 04, 2025 pm 02:06 PM

Erforschen Sie die Implementierung der Funktion des Bedien- und Drop-Einstellungsfunktion der Panel ähnlich wie VSCODE im Front-End. In der Front-End-Entwicklung wird VSCODE ähnlich wie VSCODE implementiert ...

See all articles