Quelle est la différence entre
return await foo()
et
const t = await foo();
return t
Fondamentalement, parce que return await
est redondant.
Regardez-le à partir d'un niveau légèrement supérieur de la façon dont vous utilisez réellement une fonction async
:
const myFunc = async () => {
return await doSomething();
};
await myFunc();
Toute fonction async
va déjà retourner un Promise
et doit être traitée comme un Promise
(soit directement comme un Promise
, soit aussi par await
- ing.
Si vous await
à l'intérieur de la fonction, c'est redondant parce que la fonction à l'extérieur la await
aussi, donc il n'y a aucune raison de ne pas simplement envoyer le Promise
avec et laissez la chose extérieure s'en occuper.
Ce n'est pas syntaxiquement incorrect ou incorrect et cela ne causera généralement pas de problèmes. C'est juste entièrement redondant, c'est pourquoi le linter se déclenche dessus.
L'utilisation de return await
Présente de nouveaux avantages dans le moteur v8 utilisé par Node.js, Chrome et quelques autres navigateurs:
v8 a introduit un indicateur --async-stack-traces
qui à partir de V8 v7.3 est activé par défaut (Node.js v12.0.0).
Ces indicateurs fournissent une expérience de développeur améliorée en enrichissant la propriété de pile d'erreur avec la fonction asynchrone appelle la trace de pile.
async function foo() {
return bar();
}
async function bar() {
await Promise.resolve();
throw new Error('BEEP BEEP');
}
foo().catch(error => console.log(error.stack));
Error: BEEP BEEP
at bar (<anonymous>:7:9)
Notez qu'en appelant return bar();
foo()
l'appel de fonction n'apparaît pas du tout dans la pile des erreurs. Le changer en return await bar();
donne une bien meilleure sortie de pile d'erreur:
async function foo() {
return await bar();
}
Error: BEEP BEEP
at bar (<anonymous>:7:9)
at async foo (<anonymous>:2:10)
En effet, cela offre un bien meilleur suivi de la pile d'erreurs, il est donc FORTEMENT encouragé de toujours attendre vos promesses.
De plus, async/wait now surpasse les promesses écrites à la main:
async/await
Surpasse maintenant le code de promesse manuscrit. Le point clé à retenir ici est que nous avons considérablement réduit les frais généraux des fonctions asynchrones - pas seulement dans la V8, mais dans tous les moteurs JavaScript, en corrigeant les spécifications. Source
En savoir plus sur ces changements sur le blog v8.dev: https://v8.dev/blog/fast-async#improved-developer-experience
Parce que vous pouvez simplement
async function() {
return foo();
}
Le résultat renvoyé de async function
est toujours Promise
, peu importe que vous retourniez la valeur exacte ou un autre objet Promise
à l'intérieur du corps de la fonction