async function*
BaselineWidely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.
Une déclarationasync function*
définitune fonction génératrice asynchrone, qui renvoie un objetAsyncGenerator
.
Exemple interactif
async function* foo() { yield await Promise.resolve("a"); yield await Promise.resolve("b"); yield await Promise.resolve("c");}let str = "";async function generate() { for await (const val of foo()) { str = str + val; } console.log(str);}generate();// Expected output: "abc"
Il est aussi possible de définir des fonctions génératrices asynchrones à l'aide du constructeurAsyncGeneratorFunction()
oud'une expressionasync function*
.
Syntaxe
async function* nom(param0) { instructions;}async function* nom(param0, param1) { instructions;}async function* nom(param0, param1, /* … ,*/ paramN) { instructions;}
Note :Il n'existe pas de notation équivalente aux fonctions fléchées pour les fonctions génératrices asynchrones.
Paramètres
nom
Le nom de la fonction.
param
FacultatifLe nom d'un paramètre formel pour la fonction.
instructions
FacultatifLes instructions formant le corps de la fonction.
Description
Une fonction génératrice asynchrone combine les fonctionnalités desfonctions asynchrones et desfonctions génératrices. Les deux mots-clésawait
etyield
peuvent être utilisés dans le corps d'une telle fonction. Cela permet de gérer des tâches asynchrones de façon concise avecawait
, tout en profitant de l'exécution à la demande permise par les fonctions génératrices.
À la différence des fonctions génératrices normales déclarées avecfunction*
, une fonction génératrice asynchrone renvoie un objetAsyncGenerator
qui suitle protocole itérable asynchrone. Chaque appel ànext()
renvoieune promesse qui est résolue avec l'objet résultant de l'itérateur.
Lorsqu'une promesse est déclenchée depuis un générateur asynchrone, l'état de la promesse qui est le résultat de l'itérateur correspondra à celui de la promesse déclenchée. On aura par exemple :
async function* toto() { yield Promise.reject(1);}toto() .next() .catch((e) => console.error(e));
Qui affichera1
dans la console, car la promesse ainsi générée déclenche une erreur et le résultat dans l'itérateur déclenche une erreur également. La propriétévalue
du résultat d'un générateur asynchrone résolu ne sera pas une autre promesse.
Exemples
Déclarer une fonction génératrice asynchrone
Les fonctions génératrices asynchrones produisent toujours des promesses comme résultat, même si chaque étapeyield
est synchrone.
async function* monGenerateur(etape) { await new Promise((resolve) => setTimeout(resolve, 10)); yield 0; yield etape; yield etape * 2;}const gen = monGenerateur(2);gen .next() .then((res) => { console.log(res); // { value: 0, done: false } return gen.next(); }) .then((res) => { console.log(res); // { value: 2, done: false } return gen.next(); }) .then((res) => { console.log(res); // { value: 4, done: false } return gen.next(); }) .then((res) => { console.log(res); // { value: undefined, done: true } return gen.next(); });
Utiliser une fonction génératrice asynchrone afin de lire un ensemble de fichiers
Dans cet exemple, on lit une suite de fichiers en accédant à leur contenu uniquement lorsqu'on le demande, en utilisant le module Node.jsfs/promises
.
async function* readFiles(directory) { const files = await fs.readdir(directory); for (const file of files) { const stats = await fs.stat(file); if (stats.isFile()) { yield { name: file, content: await fs.readFile(file, "utf8"), }; } }}const files = readFiles(".");console.log((await files.next()).value);// Exemple de sortie : { name: 'fichier1.txt', content: '...' }console.log((await files.next()).value);// Exemple de sortie : { name: 'fichier2.txt', content: '...' }
Spécifications
Specification |
---|
ECMAScript® 2026 Language Specification # sec-async-generator-function-definitions |
Compatibilité des navigateurs
Voir aussi
- L'expression
async function*
- L'objet
AsyncGeneratorFunction
- Le protocole itérateur
- L'objet
GeneratorFunction
yield
yield*
- L'objet
Function
- Les fonctions en JavaScript