Maison >interface Web >js tutoriel >Pourquoi l'utilisation d'Async/Await dans un constructeur de promesse est-elle un anti-modèle ?
Anti-Pattern du constructeur de promesse : utilisation d'Async/Await dans Promise()
Dans la programmation asynchrone, utilisation de async/await dans la fonction d'exécuteur d'un constructeur Promise() est considéré comme un anti-modèle. Cette pratique consiste à intégrer des promesses dans des promesses, ce qui entraîne des erreurs potentielles qui peuvent ne pas se propager correctement.
Considérez l'extrait de code ci-dessous :
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. }); }); }
Dans cet exemple, myFunction est appelée et la Le constructeur de promesse est invoqué avec une fonction asynchrone comme exécuteur. Ce modèle est problématique car il peut entraîner une propagation incorrecte des erreurs. Si des erreurs se produisent dans le rappel eachLimit, elles ne seront pas détectées par Promise et échoueront silencieusement.
De plus, l'utilisation de async/await dans le constructeur Promise peut rendre ces pièges encore plus surprenants. Par exemple, comparez ce qui suit :
let p = new Promise(resolve => { ""(); // TypeError resolve(); }); (async () => { await p; })().catch(e => console.log("Caught: " + e)); // Catches it.
Dans cet exemple, le TypeError est lancé de manière synchrone dans la fonction d'exécution. Cependant, lorsque la promesse est attendue à l'aide de async/await, l'erreur est détectée par le bloc catch, même si elle s'est produite avant la résolution de la promesse. Ce comportement peut entraîner de la confusion et des résultats inattendus.
Pour éviter cet anti-modèle, il est recommandé d'éviter d'utiliser async/await dans la fonction d'exécution d'un constructeur Promise(). Au lieu de cela, utilisez les méthodes then ou catch pour enchaîner des promesses supplémentaires et gérer les erreurs.
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!