Heim >Web-Frontend >js-Tutorial >Warum ist die Verwendung von Async/Await innerhalb eines Promise-Konstruktors ein Anti-Pattern?

Warum ist die Verwendung von Async/Await innerhalb eines Promise-Konstruktors ein Anti-Pattern?

Susan Sarandon
Susan SarandonOriginal
2025-01-05 11:23:41755Durchsuche

Why is Using Async/Await Inside a Promise Constructor an Anti-Pattern?

Promise Constructor Anti-Pattern: Verwendung von Async/Await innerhalb von Promise()

Bei der asynchronen Programmierung wird async/await innerhalb der Executor-Funktion verwendet eines Promise()-Konstruktors gilt als Anti-Muster. Bei dieser Vorgehensweise werden Versprechen in Versprechen eingebettet, was zu potenziellen Fehlern führt, die möglicherweise nicht korrekt weitergegeben werden.

Beachten Sie den folgenden Codeausschnitt:

const { eachLimit } = require("async");

function myFunction() {
 return new Promise(async (resolve, reject) => {
   eachLimit((await getAsyncArray), 500, (item, callback) => {
     // do other things that use native promises.
   }, (error) => {
     if (error) return reject(error);
     // resolve here passing the next value.
   });
 });
}

In diesem Beispiel wird die myFunction aufgerufen und die Der Promise-Konstruktor wird mit einer asynchronen Funktion als Ausführer aufgerufen. Dieses Muster ist problematisch, da es dazu führen kann, dass Fehler nicht ordnungsgemäß weitergegeben werden. Wenn innerhalb des EachLimit-Rückrufs Fehler auftreten, werden diese vom Promise nicht abgefangen und schlagen stillschweigend fehl.

Darüber hinaus kann die Verwendung von async/await im Promise-Konstruktor diese Fallen noch überraschender machen. Vergleichen Sie zum Beispiel Folgendes:

let p = new Promise(resolve => {
  ""(); // TypeError
  resolve();
});

(async () => {
  await p;
})().catch(e => console.log("Caught: " + e)); // Catches it.

In diesem Beispiel wird der TypeError synchron innerhalb der Executor-Funktion ausgelöst. Wenn jedoch mit async/await auf das Promise gewartet wird, wird der Fehler vom Catch-Block abgefangen, auch wenn er vor der Auflösung des Promise aufgetreten ist. Dieses Verhalten kann zu Verwirrung und unerwarteten Ergebnissen führen.

Um dieses Anti-Pattern zu vermeiden, wird empfohlen, die Verwendung von async/await innerhalb der Executor-Funktion eines Promise()-Konstruktors zu vermeiden. Verwenden Sie stattdessen die Then- oder Catch-Methoden, um zusätzliche Versprechen zu verketten und Fehler zu behandeln.

Das obige ist der detaillierte Inhalt vonWarum ist die Verwendung von Async/Await innerhalb eines Promise-Konstruktors ein Anti-Pattern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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