web-dev-qa-db-fra.com

Pourquoi pas de retour-attendre vs const x = attendre?

Quelle est la différence entre

return await foo()

et

const t = await foo();
return t

http://eslint.org/docs/rules/no-return-await

18
peppydip

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.

25
samanime

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

10
Bamieh

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

6
edvard chen