La capture de Toutes les Promesses de Rejets dans un Async Fonction en JavaScript
J'ai rencontré un problème avec la capture de toutes les erreurs lorsque plusieurs promesses jeter rejet des erreurs après avoir attendu dans une fonction async (javaScript - nœud v8.4.0).
Faire référence à du code javaScript suivant:
De référence, les fonctions timeoutOne() et timeoutTwo (), il suffit de retourner un natif de la promesse qui résout une valeur après 1 et 2 deuxième délai, respectivement, ou de les rejeter avec une erreur si j'ai mis "deviousState" à true.
let deviousState = true;
async function asyncParallel() {
try {
let res1 = timeoutOne();
let res2 = timeoutTwo();
console.log(`All done with ${await res1} ${await res2}`)
}
catch(err) {
console.log(err)
}
}
asyncParallel();
let pAll = Promise.all([timeoutOne(), timeoutTwo()]);
pAll.then((val) => {
console.log(`All done with ${val[0]} ${val[1]}`)
}).catch(console.log);
Dans les deux cas, seule la promesse qui renvoie connecte pour la première fois une erreur. Je sais que dans certains promesse bibliothèques il est une manière d'enregistrer toutes les erreurs (par exemple, le "régler" la méthode en bluebird), cependant, je ne suis pas sûr si il est un analogue de cette méthode en natif promesses?
Aussi, si les deux promesses de rejeter, puis asyncParallel() enregistre une erreur non interceptée, avec la promesse que rejette dernier. Est que parce qu'il n'y est pas intégré dans le mécanisme asynchrone en fonction de blocs try /catch catch de multiples rejets de cette façon?
Tout fonctionne de la même dans les deux cas, si les promesses de résoudre. C'est juste que lorsque les deux rejetons, la Promesse.toutes les poignées, les erreurs, et de l'asynchrone en fonction de la version, l'un des non gérée promesse erreurs de planter le processus dans les futures versions de nœud.
Est-il de toute façon pour les try /catch pour gérer ce type d'erreur correctement? Ou dois-je encore besoin d'utiliser une Promesse.tout l'intérieur de async fonctions pour s'assurer que les erreurs sont traitées correctement?
OriginalL'auteur MFave | 2017-10-12
Vous devez vous connecter pour publier un commentaire.
Oui - vous créé le
timeoutTwo()
promesse, mais n'a jamais manipulé ses erreurs (comme l'utilisation dans unawait
). Leawait res2
n'a jamais été exécutée en raison de l'exception dansawait res1
.(Avis ce n'est pas "la promesse qui rejette dernier", mais toujours la promesse qui est attendu à la seconde).
Dans le code séquentiel, il ne peut y avoir de multiples exceptions, donc, à venir avec d'autres syntaxe de traiter avec eux serait difficile.
Oui, exactement. Si vous voulez attendre pour de multiples promesses en parallèle, vous devriez toujours utilisation
Promise.all
. Leawait
mot-clé est juste un peu de sucre pour la suite.then()
appel.Vous devriez écrire
Non, il n'y a pas. Les caractéristiques de
settle
sont trivial à mettre en œuvre vous-même à l'aide dethen
, avec toutes les valeurs que vous désirez:OriginalL'auteur Bergi