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 宣å被å®ç¾©çºä¸ååå³ AsyncFunction ç©ä»¶çé忥å½å¼ ã
ä½ ä¹å¯ä»¥ä½¿ç¨ async function expression ä¾å®ç¾©ä¸åé忥å½å¼ã
èªæ³
async function name([param[, param[, ... param]]]) {
statements
}
忏
name-
å½å¼å稱ã
param-
å³éè³å½å¼ç忏å稱ã
statements-
çµæè©²å½å¼ä¸»é«çé³è¿°ã
åå³å¼
AsyncFunction ç©ä»¶ï¼ä»£è¡¨èä¸åé忥å½å¼ï¼è©²å½å¼æå·è¡è©²å½å¼å
§çç¨å¼ç¢¼ã
æè¿°
ç¶ async å½å¼è¢«å¼å«æï¼å®æåå³ä¸å Promiseãå¦æè©² async å½å¼åå³äºä¸åå¼ï¼Promise ççæ
å°çºä¸å帶æè©²åå³å¼ç resolvedã妿 async å½å¼æåºä¾å¤ææåå¼ï¼Promise ççæ
å°çºä¸å帶æè¢«æåºå¼ç rejectedã
async å½å¼å
§é¨å¯ä»¥ä½¿ç¨ await 表éå¼ï¼å®ææ«åæ¤ async å½å¼çå·è¡ï¼ä¸¦ä¸çå¾
å³éè³è¡¨éå¼ç Promise çè§£æï¼è§£æå®ä¹å¾æåå³è§£æå¼ï¼ä¸¦ç¹¼çºæ¤ async å½å¼çå·è¡ã
å註ï¼async/await å½å¼çç®ç卿¼ç°¡å忥æä½ promise ç表ç¾ï¼ä»¥åå°å¤å Promise ç©ä»¶å·è¡æäºæä½ãå°±å Promise é¡ä¼¼æ¼å
·çµæ§æ§çåå¼å½å¼ï¼å樣å°ï¼async/await 好æ¯å° generator è promise çµåèµ·ä¾ã
ç¯ä¾
>ç°¡å®ç¯ä¾
function resolveAfter2Seconds(x) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function add1(x) {
const a = await resolveAfter2Seconds(20);
const b = await resolveAfter2Seconds(30);
return x + a + b;
}
add1(10).then((v) => {
console.log(v); // prints 60 after 4 seconds.
});
async function add2(x) {
const p_a = resolveAfter2Seconds(20);
const p_b = resolveAfter2Seconds(30);
return x + (await p_a) + (await p_b);
}
add2(10).then((v) => {
console.log(v); // prints 60 after 2 seconds.
});
è¦åï¼ä¸è¦èª¤è§£ Promise.all ç await
å¨ add1 裡ï¼è©²å·è¡çºäºç¬¬ä¸å await èæ«åäºå
©ç§ï¼æ¥èçºäºç¬¬äºå await åæ«åäºå
©ç§ãå¨ç¬¬ä¸åè¨æå¨ï¼timerï¼è¢«è§¸ç¼åï¼ç¬¬äºåè¨æå¨ä¸¦ä¸æè¢«å»ºç«ãèå¨ add2 裡ï¼å
©åè¨æå¨é½è¢«å»ºç«èµ·ä¾ãä¹é½å·è¡ await éäºãéæå®å¸¶å¾äº resolve æç 2 ç§æ«åãè䏿¯ 4 ç§æ«åãç¶èéå
©å await å¼å«é½å¨é£çºéè¡ï¼èéå¹³è¡éè¡ãawait 䏦䏿¯ Promise.all çèªåç¨å¼ãå¦æä½ æ³è®å
©åãçè³å
©å以ä¸ç await promises åæå·è¡ï¼in parallelï¼ï¼ä½ å¿
é ä½¿ç¨ Promise.all.
ä½¿ç¨ async function æ¹å¯« promise é
ä¸å API å¼å«æåå³ç Promise æå°è´ä¸å promise éï¼å°å½å¼åéæå¤åé¨ä»½ãèæ
®ä¸åçç¨å¼ç¢¼ï¼
function getProcessedData(url) {
return downloadData(url) // returns a promise
.catch((e) => {
return downloadFallbackData(url); // returns a promise
})
.then((v) => {
return processDataInWorker(v); // returns a promise
});
}
å®å¯ä»¥ç¨ä¸åç°¡å®ç async function 便¹å¯«æé樣ï¼
async function getProcessedData(url) {
let v;
try {
v = await downloadData(url);
} catch (e) {
v = await downloadFallbackData(url);
}
return processDataInWorker(v);
}
注æä¸æ¹çç¯ä¾ï¼å¨ return é³è¿°ä¸æ²æä½¿ç¨ await é³è¿°ï¼éæ¯å çº async function çåå³å¼é±å«å°è¢«å
è£æ¼ Promise.resolve ä¹ä¸ã
è¦ç¯
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-async-function-definitions> |