Je n'arrive pas à comprendre pourquoi cela ne fonctionne pas.
Parce que main
renvoie une promesse; toutes les async
fonctions le font.
Au niveau supérieur, vous devez soit:
Utilisez une async
fonction de niveau supérieur qui ne rejette jamais (sauf si vous souhaitez des erreurs de «rejet non géré»), ou
Utilisez then
et 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 await
dans 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 catch
fonction (plutôt que try
/ catch
syntax):
(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 - then
etcatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
Le catch
gestionnaire sera appelé si des erreurs se produisent dans la chaîne ou dans votre then
gestionnaire. (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 then
rappels ne renvoie d'erreurs, rien n'est enregistré pour les gérer.
# 3 de haut niveau await
dans un module
Vous ne pouvez pas utiliser await
au 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 async
wrapper 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 await
en cours se concrétise; Lorsqu'un module utilisant le niveau supérieur await
est évalué, il renvoie essentiellement une promesse au chargeur de module (comme le fait une async
fonction), qui attend que cette promesse soit réglée avant d'évaluer les corps de tout module qui en dépend.
await
n'est rien d'autre que du sucre pour lathen
syntaxe de promesse .