916 votes

Syntaxe d'une fonction flèche asynchrone

Je peux marquer une fonction JavaScript comme étant "asynchrone" (c'est-à-dire renvoyant une promesse) avec l'attribut async mot-clé. Comme ceci :

async function foo() {
  // Do something
}

Quelle est la syntaxe équivalente pour les fonctions flèches ?

2 votes

Il est intéressant de noter qu'au moins firefox et babel vous permettent de le faire.

41 votes

var foo = async () => await Promise.resolve('ha'); - fonctionne très bien

2 votes

En disant it doesn't work ne veut rien dire... est-ce que vous obtenez une erreur ? peut-être que vous faites quelque chose de mal, sans le code qui "ne fonctionne pas" et une description significative de la façon dont il ne fonctionne pas, je ne peux que supposer que vous faites quelque chose de mal (ou que vous utilisez un vieux navigateur).

1580voto

BonsaiOak Points 5247

Async fonctions de la flèche ressemble à ça :

const foo = async () => {
  // do something
}

Async fonctions de la flèche ressemble à ceci pour un seul argument qui lui a été transmis :

const foo = async evt => {
  // do something with evt
}

Async fonctions de la flèche ressemble à ceci pour plusieurs arguments qui lui a été transmis :

const foo = async (evt, callback) => {
  // do something with evt
  // return response with callback
}

Le site anonyme fonctionne également :

const foo = async function() {
  // do something
}

Une fonction asynchrone déclaration ressemble à ça :

async function foo() {
  // do something
}

Utilisation d'une fonction asynchrone dans un rappel :

const foo = event.onCall(async () => {
  // do something
})

Utilisation de méthode asynchrone à l'intérieur d'un classe :

async foo() {
  // do something
}

21 votes

Le PO semble rechercher une fonction flèche nommée, asynchrone, qui est la seule syntaxe que vous ne montrez pas.

69 votes

En fait, const foo = async () => {} crée une fonction asynchrone nommée foo . Il est tout à fait possible de réaliser des fonctions nommées de cette manière (mais sans levage). Dans ES2016+, l'assignation d'une fonction anonyme à une variable la nomme après la variable si elle y est déclarée.

0 votes

@BenjaminGruenbaum Qu'est-ce qui a changé dans es2016+ ? Je pensais que ça avait toujours été le cas.

151voto

Edoardo L'Astorina Points 5595

C'est la façon la plus simple d'attribuer un async fonction de flèche expression à un nommé variable :

const foo = async () => {
  // do something
}

(Notez que cela n'est pas strictement équivalent à <code>async function foo() { }</code> . En plus de <a href="https://stackoverflow.com/q/34361379/247696">les différences entre les <code>function</code> et une expression fléchée </a>la fonction dans cette réponse n'est pas <a href="https://developer.mozilla.org/en-US/docs/Glossary/Hoisting" rel="noreferrer">"hissé au sommet" </a>.)

11 votes

Notez qu'une expression de fonction nommée est une syntaxe très spécifique en javascript. Ceci n'est PAS une expression de fonction nommée. Il est important d'utiliser les bons mots pour éviter toute confusion par la suite, lorsqu'une phrase peut évoluer pour signifier deux choses. Pour votre information, une expression de fonction nommée est.. : foo = function myName () {} . Le nom est myName et il est spécifié qu'il n'existe qu'à l'intérieur de la fonction anonyme et qu'il n'est défini nulle part ailleurs. Son but est de remplacer arguments.callee lors de l'écriture de fonctions anonymes récursives.

2 votes

J'étais sur le point de vous contester @slebetman sur le plan technique, puisqu'il s'agit d'une expression de fonction (flèche) et que vous vous retrouvez avec une fonction nommée (c'est-à-dire foo.name === 'foo' ). Mais seulement parce qu'il se trouve dans l'initialisateur d'une const *statement*, ce qui signifie qu'il n'est pas tout à fait correct d'appeler cela une "expression de fonction flèche asynchrone nommée". Vous avez également raison de dire que le nom d'une expression de fonction nommée est seulement lié à l'intérieur de son propre corps, mais il est également stocké dans la fonction name ce qui est utile pour le débogage (et c'est le plus souvent la raison pour laquelle je les nomme).

5 votes

En d'autres termes, il n'existe pas d'"expression de fonction fléchée nommée", mais elle peut devenir "nommée" en faisant partie d'une const ou d'une let. déclaration (pas sûr pour var à cause du hissage), dans le sens d'avoir un nom fn.name ainsi que d'avoir une liaison dans la portée (la variable).

102voto

Michael Points 79

Fonction flèche asynchrone immédiatement invoquée :

(async () => {
    console.log(await asyncFunction());
})();

Expression de fonction asynchrone immédiatement invoquée :

(async function () {
    console.log(await asyncFunction());
})();

22voto

codemirror Points 1013

Syntaxe de la fonction Async Arrow avec paramètres

const myFunction = async (a, b, c) => {
   // Code here
}

15voto

Justin E. Samuels Points 470

Vous pouvez aussi le faire :

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}

6 votes

Avec un paramètre, vous n'avez pas besoin de parenthèses. YourAsyncFunctionName = async value => { /* Le code va ici */ }

3 votes

@TakácsZsolt c'est une question de préférence. Ce que Justin a fait n'est pas mal. J'aime mettre des parenthèses au cas où je devrais ajouter d'autres paramètres à l'avenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X