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 2017å¹´4æ.
async function 宣è¨ã¯ãä¸ããããååã§æ°ããéåæé¢æ°ã®ãã¤ã³ãã使ãã¾ãããã®é¢æ°ã®æ¬ä½ã®ä¸ã§ã¯ await ãã¼ã¯ã¼ãã使ããã¨ãã§ããã¾ããasync ããã³ await ãã¼ã¯ã¼ãã使ç¨ãããã¨ã§ããããã¹ãã¼ã¹ã®éåæã®åä½ãããããã¹ãã§ã¼ã³ãæç¤ºçã«æ§æããå¿
è¦ãªãããããã£ããã¨ããæ¹æ³ã§æ¸ããã¨ãã§ãã¾ãã
éåæé¢æ°ã¯ async function å¼ã使ç¨ãã¦å®ç¾©ãããã¨ãã§ãã¾ãã
試ãã¦ã¿ã¾ããã
function resolveAfter2Seconds() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("resolved");
}, 2000);
});
}
async function asyncCall() {
console.log("calling");
const result = await resolveAfter2Seconds();
console.log(result);
// äºæ³ãããçµæ: "resolved"
}
asyncCall();
æ§æ
async function name(param0) {
statements
}
async function name(param0, param1) {
statements
}
async function name(param0, param1, /* â¦, */ paramN) {
statements
}
ã¡ã¢:
æ¹è¡ã async 㨠function ã®éã«å
¥ãã¦ã¯ããã¾ãããããããªãã¨ã»ãã³ãã³ãèªåçã«æ¿å
¥ãããasync ãèå¥åã¨ãªããæ®ãã function 宣è¨ã¨ãªãã¾ãã
弿°
name-
颿°ã®ååã§ãã
paramçç¥å¯-
颿°ã®æ£å¼ãªå¼æ°ã®ååã§ãã弿°ã®æ§æã«ã¤ãã¦ã¯ã颿°ãªãã¡ã¬ã³ã¹ãåç §ãã¦ãã ããã
statementsçç¥å¯-
颿°ã®æ¬ä½ãæ§æããæã§ãã
awaitã®ä»çµã¿ã使ç¨ãããã¨ãã§ãã¾ãã
解説
async function 宣è¨ã¯ãAsyncFunction ãªãã¸ã§ã¯ãã使ãã¾ããéåæé¢æ°ãå¼ã³åºããããã³ã«ãæ°ãããããã¹ (Promise) ãè¿ãããéåæé¢æ°ã«ãã£ã¦è¿ãããå¤ã§è§£æ±ºããã¾ããã¾ãã¯ãéåæé¢æ°å
ã§ææãããªãã£ãä¾å¤ã§æå¦ããã¾ãã
éåæé¢æ°ã«ã¯ã await å¼ãç½®ããã¨ãã§ãã¾ãã await å¼ã¯è¿ããããããã¹ãå±¥è¡ããããæå¦ãããã¾ã§å®è¡ã䏿ãããã¨ã§ããããã¹ãè¿ã颿°ãããããåæãã¦ãããã®ããã«åä½ããã¾ãããããã¹ã®è§£æ±ºæ¸ã¿ã®å¤ã¯ãawait å¼ã®è¿å¤ã¨ãã¦æ±ããã¾ããasync 㨠await ã使ç¨ããã¨ãéåæã³ã¼ãã«é常㮠try / catch ãããã¯ã使ç¨ãããã¨ãã§ãã¾ãã
ã¡ã¢:
ãã¼ã¯ã¼ã await ã¯ãé常㮠JavaScript ã³ã¼ãå
ã®éåæé¢æ°å
ã§ã®ã¿æå¹ã§ããéåæé¢æ°ã®å¤ã§ä½¿ç¨ããå ´å㯠SyntaxError ãçºçãã¾ãã
await 㯠JavaScript ã¢ã¸ã¥ã¼ã«ã§ã¯åç¬ã§ä½¿ç¨ãããã¨ãã§ãã¾ãã
ã¡ã¢:
async/await ã®ç®çã¯ããããã¹ãã¼ã¹ã® API ãå©ç¨ããã®ã«å¿
è¦ãªæ§æãç°¡ç´ åãããã¨ã§ãã async/await ã®åä½ã¯ãã¸ã§ãã¬ã¼ã¿ã¼ã¨ãããã¹ã®çµã¿åããã«ä¼¼ã¦ãã¾ãã
éåæé¢æ°ã¯å¸¸ã«ãããã¹ãè¿ãã¾ããéåæé¢æ°ã®è¿å¤ãæç¤ºçã«ãããã¹ã§ãªãå ´åã¯ãæé»çã«ãããã¹ã§ã©ããããã¾ãã
ä¾ãã°ã以ä¸ã®ã³ã¼ããèãã¦ãã ããã
async function foo() {
return 1;
}
ããã¯ã次ã®ã³ã¼ãã«ä¼¼ã¦ãã¾ãã
function foo() {
return Promise.resolve(1);
}
ãã¨ãéåæé¢æ°ã®è¿å¤ã Promise.resolve ã§ã©ããããã¦ãããã®ããã«æ¯ãèãã¨ãã¦ãããããã¯åçã§ã¯ãªããã¨ã«æ³¨æãã¦ãã ãããéåæé¢æ°ã¯å¥ã®åç
§ãè¿ãã¾ãããPromise.resolve ã¯æå®ãããå¤ããããã¹ã§ããã°åãåç
§ãè¿ãã¾ãããããã¹ã¨éåæé¢æ°ã®è¿å¤ã®ç価æ§ã調ã¹ããã¨ããã¨ãåé¡ãçºçããå¯è½æ§ãããã¾ãã
const p = new Promise((res, rej) => {
res(1);
});
async function asyncReturn() {
return p;
}
function basicReturn() {
return Promise.resolve(p);
}
console.log(p === basicReturn()); // true
console.log(p === asyncReturn()); // false
éåæé¢æ°ã®æ¬ä½ã¯ã0 å以ä¸ã® await å¼ã§åå²ããã¦ããã¨èãããã¨ãã§ãã¾ããæä¸ä½ã®ã³ã¼ãã¯ãæåã® await å¼ï¼ããå ´åï¼ã¾ã§å«ãã¦åæçã«å®è¡ããã¾ãããã®æ¹æ³ã§ã¯ãawait å¼ã®ãªãéåæé¢æ°ã¯åæçã«å®è¡ããã¾ãããããã颿°æ¬ä½å ã« await å¼ãããå ´åãéåæé¢æ°ã¯å¸¸ã«éåæçã«å®äºãã¾ãã
ä¾:
async function foo() {
await 1;
}
ããã¯æ¬¡ã®ãã®ã¨ç価ã§ãã
function foo() {
return Promise.resolve(1).then(() => undefined);
}
ããããã® await å¼ã®å¾ã®ã³ã¼ãã¯ã.then ã³ã¼ã«ããã¯ã®ä¸ã«åå¨ããã¨èãããã¨ãã§ãã¾ãããã®ããã«ãã¦ã颿°ãå帰çã«å®è¡ãããã³ã«ããããã¹ãã§ã¼ã³ãå¾ã
ã«æ§ç¯ããã¦ããã¾ããè¿å¤ã¯ãã§ã¼ã³ã®æå¾ã®ãªã³ã¯ã«ãªãã¾ãã
次ã®ä¾ã§ã¯ã 2 ã¤ã®ãããã¹ãé£ç¶ãã¦å¾
ã¡åãã¾ãã颿° foo ã®å¦ç㯠3 段éã«åããã¦ãã¾ãã
- 颿° foo ã®æ¬ä½ã®æåã®è¡ã¯ãä¿çä¸ã®ãããã¹ã§ await å¼ãæ§æãããç¶æ
ã§ãåæçã«å®è¡ããã¾ãããã®å¾ã
fooã®å¦çã¯ä¸æãããfooãå¼ã³åºãã颿°ã«å¶å¾¡ãè¿ããã¾ãã - ãã°ãããã¦ãæåã®ãããã¹ãå±¥è¡ããããæå¦ãããã¨ãå¶å¾¡ã¯
fooã«æ»ãã¾ããï¼æå¦ãããªãã£ãå ´åã¯ï¼æåã®ãããã¹ãå±¥è¡ãããçµæã await å¼ããè¿ããã¾ããããã§ã¯1ãresult1ã«ä»£å ¥ããã¾ããå¦çã¯ç¶ãã2 ã¤ç®ã® await å¼ãè©ä¾¡ããã¾ãããã®ã¨ããfooã®å¦çã䏿ãããå¶å¾¡ãç§»è²ããã¾ãã - ãã°ãããã¦ã2 ã¤ç®ã®ãããã¹ãå±¥è¡ããããæå¦ãããã¨ããå¶å¾¡ã¯
fooã«åã³å ¥ãã¾ãã2 ã¤ç®ã®ãããã¹ã解決ããçµæã 2 çªç®ã® await å¼ããè¿ããã¾ããããã§ã¯2ãresult2ã«ä»£å ¥ããã¾ããå¶å¾¡ã¯ï¼ããããã°ï¼return å¼ã«ç§»ãã¾ããæ¢å®ã®è¿å¤ã§ããundefinedããç¾å¨ã®ãããã¹ã®è§£æ±ºå¤ã¨ãã¦è¿ããã¾ãã
async function foo() {
const result1 = await new Promise((resolve) =>
setTimeout(() => resolve("1")),
);
const result2 = await new Promise((resolve) =>
setTimeout(() => resolve("2")),
);
}
foo();
ãããã¹ãã§ã¼ã³ãä¸åº¦ã«æ§ç¯ãããªããã¨ã«æ³¨æãã¦ãã ããããããã¹ãã§ã¼ã³ã¯ãéåæé¢æ°ã«å¶å¾¡ã渡ãããæ»ãããããªãããæ®µéçã«æ§ç¯ããã¦ããã¾ãããã®ãããåæä¸¦è¡ã®éåæå¦çãè¡ãéã«ã¯ãã¨ã©ã¼å¦çã®åä½ã«æ³¨æããªããã°ãªãã¾ããã
ä¾ãã°ã以ä¸ã®ã³ã¼ãã§ã¯ããããã¹ãã§ã¼ã³ã®å
ã« .catch ãã³ãã©ã¼ãè¨å®ããã¦ããã¨ãã¦ããæªå¦çã®ãããã¹æå¦ã¨ã©ã¼ãçºçãã¾ããããã¯ãp1 ããå¶å¾¡ãæ»ãã¾ã§ãp2 ããããã¹ãã§ã¼ã³ã«ãé
ç·ããããªãããã§ãã
async function foo() {
const p1 = new Promise((resolve) => setTimeout(() => resolve("1"), 1000));
const p2 = new Promise((_, reject) =>
setTimeout(() => reject(new Error("failed")), 500),
);
const results = [await p1, await p2]; // ããããªãã§ãã ããã Promise.all ã¾ã㯠Promise.allSettled ã使ç¨ãã¦ãã ããã
}
foo().catch(() => {}); // ãã¹ã¦ã®ã¨ã©ã¼ãæµ
ããããã¨ãã...
async function 宣è¨ã¯ãfunction 宣è¨ã¨ä¼¼ãæåããã¾ããã¤ã¾ããå·»ãä¸ãã«ããã¹ã³ã¼ãã®å
é ã«ç§»åããã¹ã³ã¼ãå
ã®ã©ãããã§ãå¼ã³åºããã¨ãã§ãã¾ããã¾ããç¹å®ã®ã³ã³ããã¹ãã§ã®ã¿å宣è¨ãããã¨ãã§ãã¾ãã
ä¾
>éåæé¢æ°ã¨å®è¡é
function resolveAfter2Seconds() {
console.log("starting slow promise");
return new Promise((resolve) => {
setTimeout(() => {
resolve("slow");
console.log("slow promise is done");
}, 2000);
});
}
function resolveAfter1Second() {
console.log("starting fast promise");
return new Promise((resolve) => {
setTimeout(() => {
resolve("fast");
console.log("fast promise is done");
}, 1000);
});
}
async function sequentialStart() {
console.log("== sequentialStart éå§ ==");
// 1. ã¿ã¤ãã¼ã®èµ·åãå®äºå¾ã«ãã°åºå
const slow = resolveAfter2Seconds();
console.log(await slow);
// 2. ååã®ã¿ã¤ãã¼ãå¾
ã£ãå¾ã§æ¬¡ã®ã¿ã¤ãã¼ãéå§
const fast = resolveAfter1Second();
console.log(await fast);
console.log("== sequentialStart çµäº ==");
}
async function sequentialWait() {
console.log("== sequentialWait éå§ ==");
// 1. 2 ã¤ã®ã¿ã¤ãã¼ãåæã«éå§ããã«ã¯ããäºããå¾
ã¤å¿
è¦ã¯ãªã
const slow = resolveAfter2Seconds();
const fast = resolveAfter1Second();
// 2. slow ã¿ã¤ãã¼ãå®å
¨ã«çµäºããã¾ã§å¾
ã¡ããã®å¾ãçµæããã°åºåãã
console.log(await slow);
// 3. fast ã¿ã¤ãã¼ãå®å
¨ã«çµäºããã¾ã§å¾
ã¡ããã®å¾ãçµæããã°åºåãã
console.log(await fast);
console.log("== sequentialWait çµäº ==");
}
async function concurrent1() {
console.log("== concurrent1 éå§ ==");
// 1. 2 ã¤ã®ã¿ã¤ãã¼ãåæã«éå§ããã©ã¡ããå®äºããã®ãå¾
ã¤
const results = await Promise.all([
resolveAfter2Seconds(),
resolveAfter1Second(),
]);
// 2. ãããããã°åºåãã
console.log(results[0]);
console.log(results[1]);
console.log("== concurrent1 çµäº ==");
}
async function concurrent2() {
console.log("== concurrent2 éå§ ==");
// 2 ã¤ã® jobs ã並åã«å®è¡ã両æ¹ãå®äºããã®ãå¾
ã¤
await Promise.all([
(async () => console.log(await resolveAfter2Seconds()))(),
(async () => console.log(await resolveAfter1Second()))(),
]);
console.log("== concurrent2 çµäº ==");
}
sequentialStart(); // 2 ç§å¾ã« "slow" ããã°åºåãããã® 1 ç§å¾ã« "fast" ããã°åºåãã
// ç´åã®å¦çãå¾
ã¤
setTimeout(sequentialWait, 4000); // 2 ç§å¾ã« "slow" 㨠"fast" ããã°åºåãã
// ç´åã®å¦çãå¾
ã¤
setTimeout(concurrent1, 7000); // concurrentStart ã¨åæ§
// ç´åã®å¦çãå¾
ã¤
setTimeout(concurrent2, 10000); // æ¬å½ã«ä¸¦åå¦çã¨ãªããã 1 ç§å¾ã« "fast" ã¨ãã°åºåãããã® 1 ç§å¾ã« "slow" ã¨ãã°åºåãã
await ã¨ä¸¦è¡æ§
sequentialStart ã§ã¯ãæåã® await ã®ããã«å®è¡ã 2 ç§éå¾
æ©ãã 2 ã¤ç®ã® await ã®ããã«ããã« 1 ç§éå¾
æ©ãã¾ãã 2 ã¤ç®ã®ã¿ã¤ãã¼ã¯æåã®ã¿ã¤ãã¼ãèµ·åãã¦ããéã¯ä½æããã¾ãããã³ã¼ã㯠3 ç§å¾ã«çµäºãã¾ãã
sequentialWait ã§ã¯ã両æ¹ã®ã¿ã¤ãã¼ã使ããã両æ¹ã¨ã await ããããããªãã¡å¾
æ©ããããã¾ããã¿ã¤ãã¼ã¯åæã«å®è¡ããã¦ããããã 3 ç§å¾ã§ã¯ãªã 2 ç§å¾ã«ãããªãã¡æãé
ãã¿ã¤ãã¼ã«ãããã¦çµäºãã¾ãã
ãããã await ã®å¼ã³åºãã¯ä¾ç¶ã¨ãã¦é次å¦çã§ããããã㯠2 ã¤ç®ã® await ã 1 ã¤ç®ã®çµäºã¾ã§å¾
ã¤ãã¨ãæå³ãã¾ãããã®ã±ã¼ã¹ã§ã¯ãæãéãã¿ã¤ãã¼ãæãé
ãã¿ã¤ãã¼ã®ãã¨ã«å¦çããããã¨ã«ãªãã¾ãã
è¤æ°ã®å¦çãå®å
¨ã«ä¸¦è¡ã«å®è¡ãããå ´åã¯ãPromise.all() ã¾ã㯠Promise.allSettled() ã®å¼ã³åºãã§å¾
ã¤å¿
è¦ãããã¾ãã
è¦å:
颿° sequentialWait 㨠concurrent1 ã¯æ©è½çã«åçã§ã¯ããã¾ããã
sequentialWait ã§ã¯ããããã¹ fast ããããã¹ slow ã®å±¥è¡ãããåã«æå¦ãããå ´åãå¼ã³åºãå
ã catch ç¯ãæ§æãã¦ãããã©ããã«ãããããããããã¹ã®æå¦ãå¦çãããªãã¨ããã¨ã©ã¼ãçºçãã¾ãã
concurrent1 ã§ã¯ãPromise.all ããããã¹ãã§ã¼ã³ã䏿¬ãã¦é
ç·ãã¾ããã¤ã¾ããæä½ã¯ãããã¹ã®æå¦ã®é çªã«é¢ä¿ãªããã°ãã失æããã¨ã©ã¼ã¯æ§æããããããã¹ãã§ã¼ã³å
ã§å¸¸ã«çºçãããããéå¸¸ã®æ¹æ³ã§ææãããã¨ãã§ãã¾ãã
ãããã¹ãã§ã¼ã³ãéåæé¢æ°ã§æ¸ãæãã
Promise ãè¿ã API ã¯ãããã¹ãã§ã¼ã³ãè¿ãã颿°ãè¤æ°ã®é¨åã«åå²ã§ãã¾ããæ¬¡ã®ã³ã¼ããæ³å®ãã¦ãã ããã
function getProcessedData(url) {
return downloadData(url) // ãããã¹ãè¿ã
.catch((e) => downloadFallbackData(url)) // ãããã¹ãè¿ã
.then((v) => processDataInWorker(v)); // ãããã¹ãè¿ã
}
次ã®ããã« 1 ã¤ã®éåæé¢æ°ã«æ¸ãæãããã¨ãã§ãã¾ãã
async function getProcessedData(url) {
let v;
try {
v = await downloadData(url);
} catch (e) {
v = await downloadFallbackData(url);
}
return processDataInWorker(v);
}
ä»ã«ãã catch() ã«ãã£ã¦ãããã¹ãé£éããããã¨ãã§ãã¾ãã
async function getProcessedData(url) {
const v = await downloadData(url).catch((e) => downloadFallbackData(url));
return processDataInWorker(v);
}
2 çªç®ã®ä¾ã§ã¯ãæå¹ã§ããã«ãããããããawait æã return ãã¼ã¯ã¼ãã®å¾ã«ãªããã¨ã«æ³¨æãã¦ãã ãããéåæé¢æ°ã®è¿å¤ã¯ãï¼ãã®ä¾ã®ããã«ï¼æ¢ã«ãããã¹ã«ãªã£ã¦ããªãå ´åãæé»çã« Promise.resolve ã§ã©ãããããããã§ãã
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-async-function-definitions> |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
- 颿°ã¬ã¤ã
- ãããã¹ã®ä½¿ç¨ã¬ã¤ã
- 颿°
AsyncFunctionasync functionå¼functionfunction*async function*awaitPromise- Decorating async JavaScript functions (innolitics.com, 2016)