Das Anti-Pattern der Verschachtelung von async/await innerhalb von Promise-Konstruktoren
In diesem Fall wird die Funktion async.eachLimit zur Verwaltung eingesetzt Aufgrund der Anzahl gleichzeitiger Vorgänge entsteht ein Dilemma. Die anfängliche Versuchung besteht darin, den Code wie folgt zu strukturieren:
function myFunction() { return new Promise(async (resolve, reject) => { eachLimit((await getAsyncArray), 500, (item, callback) => { // Operations using native promises }, (error) => { if (error) return reject(error); // Resolve with the next value }); }); }
Obwohl es logisch erscheinen mag, die Funktion „myFunction“ als asynchron zu deklarieren, ist dies nicht machbar, da der innere Rückruf der Funktion „eachLimit“ erhalten bleibt unzugänglich. Allerdings birgt dieser Ansatz eine erhebliche Gefahr: Fehler können möglicherweise nicht behandelt werden.
Dieser Ansatz ist ein Lehrbuchbeispiel für das Anti-Pattern, bei dem Versprechen innerhalb des Konstruktors eines anderen Versprechens verwendet werden. In diesem Fall ist die Gefahr unbehandelter Fehler besonders groß. Um dies zu vermeiden, betrachten Sie den folgenden Codeausschnitt:
let p = new Promise(resolve => { ""(); // TypeError resolve(); }); (async () => { await p; })().catch(e => console.log("Caught: " + e)); // Catches the error.
Während in diesem Szenario die erste Zeile eine Ausnahme auslöst, wird der Fehler ordnungsgemäß vom „catch“-Block der asynchronen Pfeilfunktion behandelt. Die richtige Fehlerbehandlung ist entscheidend, um die Stabilität aufrechtzuerhalten und unerwartetes Verhalten in Ihrer Codebasis zu verhindern.
Das obige ist der detaillierte Inhalt vonWarum ist die Verschachtelung von „async/await' in Promise-Konstruktoren ein Anti-Pattern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!