Je n'arrive pas à comprendre pourquoi cela ne fonctionne pas.
Parce que mainrenvoie une promesse; toutes les asyncfonctions le font.
Au niveau supérieur, vous devez soit:
Utilisez une asyncfonction de niveau supérieur qui ne rejette jamais (sauf si vous souhaitez des erreurs de «rejet non géré»), ou
Utilisez thenet catch, ou
(Prochainement!) Utilisez le plus haut niveauawait , une proposition qui a atteint l'étape 3 dans le processus qui permet une utilisation de haut niveau awaitdans un module.
# 1 - De haut niveau async Fonction de qui ne rejette jamais
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
Remarquez le catch; vous devez gérer les rejets de promesse / exceptions asynchrones, car rien d'autre ne le fera; vous n'avez aucun appelant à qui les transmettre. Si vous préférez, vous pouvez le faire sur le résultat de son appel via la catchfonction (plutôt que try/ catchsyntax):
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
... ce qui est un peu plus concis (je l'aime pour cette raison).
Ou, bien sûr, ne gérez pas les erreurs et autorisez simplement l'erreur de «rejet non géré».
# 2 - thenetcatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
Le catchgestionnaire sera appelé si des erreurs se produisent dans la chaîne ou dans votre thengestionnaire. (Assurez-vous que votrecatch gestionnaire ne renvoie pas d'erreurs, car rien n'est enregistré pour les gérer.)
Ou les deux arguments pour then:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
Notez à nouveau que nous enregistrons un gestionnaire de rejet. Mais sous cette forme, assurez-vous qu'aucun de vos thenrappels ne renvoie d'erreurs, rien n'est enregistré pour les gérer.
# 3 de haut niveau awaitdans un module
Vous ne pouvez pas utiliser awaitau niveau supérieur d'un script non-module, mais la proposition de niveau supérieurawait ( étape 3 ) vous permet de l'utiliser au niveau supérieur d'un module. C'est similaire à l'utilisation d'un asyncwrapper de fonction de niveau supérieur (n ° 1 ci-dessus) en ce sens que vous ne voulez pas que votre code de niveau supérieur rejette (renvoie une erreur) car cela entraînera une erreur de rejet non gérée. Donc, à moins que vous ne souhaitiez avoir ce rejet non géré lorsque les choses tournent mal, comme avec # 1, vous voudrez envelopper votre code dans un gestionnaire d'erreurs:
// In a module, once the top-level `await` proposal lands
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
Notez que si vous faites cela, tout module qui importe depuis votre module attendra que la promesse que vous êtes awaiten cours se concrétise; Lorsqu'un module utilisant le niveau supérieur awaitest évalué, il renvoie essentiellement une promesse au chargeur de module (comme le fait une asyncfonction), qui attend que cette promesse soit réglée avant d'évaluer les corps de tout module qui en dépend.
awaitn'est rien d'autre que du sucre pour lathensyntaxe de promesse .