async function*
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since â¨2020å¹´1æâ©.
async function* 宣è¨ã¯éåæã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ãå®ç¾©ãããã㯠AsyncGenerator ãªãã¸ã§ã¯ããè¿ãã¾ãã
éåæã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã¯ãAsyncGeneratorFunction ã³ã³ã¹ãã©ã¯ã¿ã¼ã async function* å¼ã®æ§æã使ç¨ãã¦å®ç¾©ãããã¨ãã§ãã¾ãã
試ãã¦ã¿ã¾ããã
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"
æ§æ
async function* name(param0) {
statements
}
async function* name(param0, param1) {
statements
}
async function* name(param0, param1, /* ⦠,*/ paramN) {
statements
}
ã¡ã¢: éåæã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã«ã¯ã対å¿ããã¢ãã¼é¢æ°ã¯ããã¾ããã
弿°
name-
颿°åã§ãã
paramçç¥å¯-
颿°ã®æ§æä¸ã®å¼æ°åã§ãã
statementsçç¥å¯-
颿°ã®æ¬ä½ãæ§æããæã§ãã
解説
éåæã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã¯ãéåæé¢æ°ã¨ã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã®æ©è½ãçµã¿åããããã®ã§ãã颿°ã®å
é¨ã§ await 㨠yield ã®ãã¼ã¯ã¼ãã®ä¸¡æ¹ã使ããã¨ãã§ãã¾ããããã«ãããã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã®é
å»¶ã®æ§è³ªãå©ç¨ããªãããawait ã§äººéå·¥å¦çã«éåæã¿ã¹ã¯ãå¦çãããã¨ãã§ããããã«ãªãã¾ãã
function* ã§å®£è¨ãããé常ã®ã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã¨ã¯ç°ãªããéåæã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã¯ AsyncGenerator ãªãã¸ã§ã¯ããè¿ãã¾ããéåæå復å¯è½ãããã³ã«ã«æºæ ãã¦ãã¾ããnext() ãå¼ã³åºããã³ã«ãã¤ãã¬ã¼ã¿ã¼ã®çµæãªãã¸ã§ã¯ãã«è§£æ±ºãã Promise ãè¿ãã¾ãã
éåæã¸ã§ãã¬ã¼ã¿ã¼ãããããã¹ãçæãããã¨ãã¤ãã¬ã¼ã¿ã¼ã®çµæã®ãããã¹ã®æçµçãªç¶æ ã¯ãçæããããããã¹ã®ç¶æ ã¨ä¸è´ãã¾ããä¾ãã°æ¬¡ã®ããã«ãªãã¾ãã
async function* foo() {
yield Promise.reject(1);
}
foo()
.next()
.catch((e) => console.error(e));
çæããããããã¹ãæå¦ãããå ´åãã¤ãã¬ã¼ã¿ã¼ã®çµæãæå¦ãããããã1 ããã°åºåããã¾ããéåæã¸ã§ãã¬ã¼ã¿ã¼ã®è§£æ±ºçµæã® value ããããã£ã¯ãå¥ã®ãããã¹ã«ã¯ãªãã¾ããã
async function* 宣è¨ã¯ããã®ã¹ã³ã¼ãã®å
é ã«å·»ãä¸ãããããã®ã¹ã³ã¼ãå
ã®ã©ãã§ãå¼ã³åºããã¨ãã§ãã¾ãã
ä¾
>éåæã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã®å®£è¨
éåæã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã¯ã常ã«çµæã®ãããã¹ãçæãã¾ããããããã® yield æé ãåæçã§ãã£ã¦ãã§ãã
async function* myGenerator(step) {
await new Promise((resolve) => setTimeout(resolve, 10));
yield 0;
yield step;
yield step * 2;
}
const gen = myGenerator(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();
});
éåæã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ãç¨ãã¦ä¸é£ã®ãã¡ã¤ã«ãèªã¿è¾¼ã
ãã®ä¾ã§ã¯ãNode ã® fs/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);
// Possible output: { name: 'file1.txt', content: '...' }
console.log((await files.next()).value);
// Possible output: { name: 'file2.txt', content: '...' }
仿§æ¸
| Specification |
|---|
| ECMAScript® 2026 Language Specification > # sec-async-generator-function-definitions > |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
async function*å¼AsyncGeneratorFunctionãªãã¸ã§ã¯ã- ã¤ãã¬ã¼ã¿ã¼ãããã³ã«
GeneratorFunctionãªãã¸ã§ã¯ãyieldyield*Functionãªãã¸ã§ã¯ã- 颿°