Baseline Widely available
async function
声æå建ä¸ä¸ªç»å®å°ç»å®åç§°çæ°å¼æ¥å½æ°ã彿°ä½å
å
è®¸ä½¿ç¨ await
å
³é®åï¼è¿ä½¿å¾æä»¬å¯ä»¥æ´ç®æ´å°ç¼ååºäº promise ç弿¥ä»£ç ï¼å¹¶ä¸é¿å
äºæ¾å¼å°é
ç½® promise é¾çéè¦ã
ä½ ä¹å¯ä»¥ä½¿ç¨ 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);
// Expected output: "resolved"
}
asyncCall();
è¯æ³
async function name(param0) {
statements
}
async function name(param0, param1) {
statements
}
async function name(param0, param1, /* â¦, */ paramN) {
statements
}
夿³¨ï¼ async
å function
ä¹é´ä¸è½æè¡ç»æ¢ç¬¦ï¼å¦å JavaScript ä¼èªå¨æå
¥åå·ï¼å¯¼è´ async
æä¸ºæ è¯ç¬¦ï¼èå©ä½é¨åæä¸º function
声æã
name
彿°åç§°ã
param
å¯é
彿°çå½¢ååç§°ãæå ³åæ°çè¯æ³ï¼è¯·åé 彿°åæ°ã
statements
å¯é
å
å«å½æ°ä¸»ä½ç表达å¼ãå¯ä»¥ä½¿ç¨ await
æºå¶ã
async function
声æå建ä¸ä¸ª AsyncFunction
å¯¹è±¡ãæ¯æ¬¡è°ç¨å¼æ¥å½æ°æ¶ï¼é½ä¼è¿åä¸ä¸ªæ°ç Promise
对象ï¼è¯¥å¯¹è±¡å°ä¼è¢«è§£å³ä¸ºå¼æ¥å½æ°çè¿åå¼ï¼æè
被æç»ä¸ºå¼æ¥å½æ°ä¸æªæè·çå¼å¸¸ã
弿¥å½æ°å¯ä»¥å
å«é¶ä¸ªæè
å¤ä¸ª await
表达å¼ãawait 表达å¼éè¿æåæ§è¡ä½¿è¿å promise ç彿°è¡¨ç°å¾å忥彿°ä¸æ ·ï¼ç´å°è¿åç promise 被å
ç°ææç»ãè¿åç promise çè§£å³å¼ä¼è¢«å½ä½è¯¥ await 表达å¼çè¿åå¼ãä½¿ç¨ async
/await
å
³é®åå°±å¯ä»¥ä½¿ç¨æ®éç try
/catch
代ç åæè·å¼æ¥ä»£ç ä¸çé误ã
夿³¨ï¼ await
å
³é®ååªå¨å¸¸è§ JavaScript 代ç ä¸ç弿¥å½æ°å
ææãå¦æä½ å¨å¼æ¥å½æ°ä½ä¹å¤ä½¿ç¨å®ï¼åä¼æåº SyntaxError
ã
await
å¯ä»¥åç¬ä¸ JavaScript 模åä¸èµ·ä½¿ç¨ã
夿³¨ï¼ async
/await
çç®çå¨äºç®å使ç¨åºäº promise ç API æ¶æéçè¯æ³ãasync
/await
çè¡ä¸ºå°±å¥½åæé
使ç¨äºçæå¨å promiseã
弿¥å½æ°æ»æ¯è¿åä¸ä¸ª promiseã妿ä¸ä¸ªå¼æ¥å½æ°çè¿åå¼çèµ·æ¥ä¸æ¯ promiseï¼é£ä¹å®å°ä¼è¢«éå¼å°å è£ å¨ä¸ä¸ª promise ä¸ã
ä¾å¦ï¼è¯·ç以ä¸ä»£ç ï¼
async function foo() {
return 1;
}
类似äºï¼
function foo() {
return Promise.resolve(1);
}
夿³¨ï¼
å³ä½¿å¼æ¥å½æ°çè¿åå¼çèµ·æ¥åæ¯è¢«å
è£
å¨äºä¸ä¸ª Promise.resolve
ä¸ï¼ä½å®ä»¬ä¸æ¯çä»·çã
妿ç»å®ç弿¯ä¸ä¸ª promiseï¼å¼æ¥å½æ°ä¼è¿åä¸ä¸ªä¸åçå¼ç¨ï¼è Promise.resolve
ä¼è¿åç¸åçå¼ç¨ï¼
å½ä½ æ³è¦æ£æ¥ä¸ä¸ª promise åä¸ä¸ªå¼æ¥å½æ°çè¿å弿¯å¦çä»·æ¶ï¼è¿å¯è½æ¯ä¸ä¸ªéº»ç¦ã
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
弿¥å½æ°ç彿°ä½å¯ä»¥è¢«ç使¯ç±é¶ä¸ªæè å¤ä¸ª await 表达å¼åå²å¼æ¥çãä»é¡¶å±ä»£ç ç´å°ï¼å¹¶å æ¬ï¼ç¬¬ä¸ä¸ª await 表达å¼ï¼å¦ææçè¯ï¼é½æ¯åæ¥è¿è¡çãå æ¤ï¼ä¸å å« await 表达å¼ç弿¥å½æ°æ¯åæ¥è¿è¡çãç¶èï¼å¦æå½æ°ä½å å å« await 表达å¼ï¼å弿¥å½æ°å°±ä¸å®ä¼å¼æ¥å®æã
ä¾å¦ï¼
async function foo() {
await 1;
}
çä»·äºï¼
function foo() {
return Promise.resolve(1).then(() => undefined);
}
æ¯ä¸ª await 表达å¼ä¹åç代ç å¯ä»¥è¢«è®¤ä¸ºåå¨äº .then
åè°ä¸ãéè¿è¿ç§æ¹å¼ï¼å¯ä»¥éè¿å½æ°çæ¯ä¸ªå¯éå
¥æ¥éª¤æ¥éæ¥æå»º promise é¾ãèè¿å弿æäºé¾ä¸çæåä¸ä¸ªç¯ã
卿¥ä¸æ¥ç示ä¾ä¸ï¼æä»¬ä¾æ¬¡ await 两个 promiseï¼æ´ä¸ª foo
彿°çæ§è¡å°ä¼è¢«å为ä¸ä¸ªé¶æ®µã
foo
彿°ç第ä¸è¡å°ä¼åæ¥æ§è¡ï¼å
¶ä¸ await é
ç½®äºå¾
å®ç promiseãç¶å foo
çè¿ç¨å°è¢«æåï¼å¹¶å°æ§å¶æäº¤è¿ç»è°ç¨ foo
ç彿°ãfoo
å
ã第ä¸ä¸ª promise çå
ç°ç»æï¼å¦ææ²¡æè¢«æç»çè¯ï¼å°ä½ä¸º await 表达å¼çè¿åå¼ãå¨è¿é 1
被èµå¼ç» result1
ãç¨åºç»§ç»æ§è¡ï¼å¹¶è®¡ç®ç¬¬äºä¸ª await 表达å¼ãåæ ·çï¼foo
çè¿ç¨å°è¢«æåï¼å¹¶äº¤åºæ§å¶æãfoo
ã第äºä¸ª promise çå
ç°ç»æå°ä½ä¸ºç¬¬äºä¸ª await 表达å¼çè¿åå¼ãå¨è¿é 2
被èµå¼ç» result2
ãç¨åºç»§ç»æ§è¡å°è¿å表达å¼ï¼å¦ææçè¯ï¼ãé»è®¤çè¿åå¼ undefined
å°ä½ä¸ºå½å promise çå
ç°å¼è¢«è¿åãasync function foo() {
const result1 = await new Promise((resolve) =>
setTimeout(() => resolve("1")),
);
const result2 = await new Promise((resolve) =>
setTimeout(() => resolve("2")),
);
}
foo();
注æï¼promise é¾ä¸æ¯ä¸æ¬¡å°±æå»ºå¥½çï¼ç¸åï¼promise 龿¯éçæ§å¶æä¾æ¬¡å¨å¼æ¥å½æ°ä¸äº¤åºå¹¶è¿åèåé¶æ®µæå»ºçãå æ¤å¨å¤çå¹¶å弿¥æä½æ¶ï¼æä»¬å¿ é¡»å°å¿é误å¤çã
ä¾å¦ï¼å¨ä¸é¢ä»£ç ä¸ï¼å³ä½¿å¨ promise é¾ä¸è¿ä¸æ¥é
ç½®äº .catch
å¤çæ¹æ³ï¼ä¹ä¼æåºä¸ä¸ªæªå¤çç promise 被æç»çé误ãè¿æ¯å 为 p2
ç´å°æ§å¶ä» p1
è¿ååæä¼è¿æ¥å° promise é¾ã
async function foo() {
const p1 = new Promise((resolve) => setTimeout(() => resolve("1"), 1000));
const p2 = new Promise((_, reject) => setTimeout(() => reject("2"), 500));
const results = [await p1, await p2]; // ä¸è¦è¿ä¹åï¼è¯·ä½¿ç¨ Promise.all æè
Promise.allSettledã
}
foo().catch(() => {}); // å°è¯ææææçé误...
async function
声æçè¡ä¸ºç±»ä¼¼äº function
声æï¼å®ä¼è¢«æåå°å
¶ä½ç¨åçé¡¶é¨ï¼å¹¶ä¸å¯ä»¥å¨å
¶ä½ç¨åçä»»ä½ä½ç½®è¢«è°ç¨ï¼å¹¶ä¸åªè½å¨å
¶ä»ä¸ä¸æä¸è¢«éæ°å£°æã
function resolveAfter2Seconds() {
console.log("å¼å§è¾æ
¢å
ç°ç promise");
return new Promise((resolve) => {
setTimeout(() => {
resolve("slow");
console.log("è¾æ
¢å
ç°ç promise 宿äº");
}, 2000);
});
}
function resolveAfter1Second() {
console.log("å¼å§è¾å¿«å
ç°ç promise");
return new Promise((resolve) => {
setTimeout(() => {
resolve("fast");
console.log("è¾å¿«å
ç°ç promise 宿äº");
}, 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. å¯å¨ä¸¤ä¸ªè®¡æ¶å¨ï¼äºä¸çå¾
const slow = resolveAfter2Seconds();
const fast = resolveAfter1Second();
// 2. çå¾
è¾æ
¢ç计æ¶å¨å®æåï¼æå°ç»æ
console.log(await slow);
// 3. çå¾
è¾å¿«ç计æ¶å¨å®æåï¼æå°ç»æ
console.log(await fast);
console.log("== sequentialWait ç»æ ==");
}
async function concurrent1() {
console.log("== concurrent1 å¼å§ ==");
// 1. å¹¶åå¯å¨ä¸¤ä¸ªè®¡æ¶å¨ï¼å¹¶çå¾
å®ä»¬å®æ
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 å¼å§ ==");
// 1. å¹¶åå¯å¨ä¸¤ä¸ªè®¡æ¶å¨ï¼å¹¶å¨å
¶ä¸ä»»æä¸ä¸ªå®æåç«å³æå°å¯¹åºç»æ
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); // è· sequentialWait 䏿 ·
// 忬¡çå¾
setTimeout(concurrent2, 10000); // 1 ç§åï¼æå°âfastâï¼ç¶åè¿ 1 ç§ï¼æå°âslowâ
await åå¹¶åæ§è¡
å¨ sequentialStart
ä¸ï¼ç¨åºæ§è¡ç¬¬ä¸ä¸ª await
æ¶æå 2 ç§ï¼ç¶åå为第äºä¸ª await
æåäº 1 ç§ãç´å°ç¬¬ä¸ä¸ªè®¡æ¶å¨ç»æåï¼ç¬¬äºä¸ªè®¡æ¶å¨æè¢«å建ï¼å æ¤ç¨åºéè¦ 3 ç§æ§è¡å®æ¯ã
å¨ sequentialWait
ä¸ï¼ä¸¤ä¸ªè®¡æ¶å¨é½è¢«åå»ºå¹¶ç¨ await
è¿è¡çå¾
ãè¿ä¸¤ä¸ªè®¡æ¶å¨å¹¶è¡è¿è¡ï¼è¿æå³ç代ç è¿è¡æ¶é´ç¼©çå° 2 ç§ï¼è䏿¯ 3 ç§ï¼å³è¾æ
¢ç计æ¶å¨çæ¶é´ãç¶èï¼await
è°ç¨ä»æ§æ¯é¡ºåºæ§è¡çï¼è¿æå³ç第äºä¸ª await
ä¼çå¾
第ä¸ä¸ªæ§è¡å®ãå¨è¿ä¸ªä¾åä¸ï¼è¾å¿«ç计æ¶å¨çç»æä¼å¨è¾æ
¢ç计æ¶å¨ä¹å被å¤çã
å¨ concurrentStart
ä¸ï¼ä¸¤ä¸ªè®¡æ¶å¨è¢«åæ¶å建ï¼ç¶åæ§è¡ await
ãè¿ä¸¤ä¸ªè®¡æ¶å¨åæ¶è¿è¡ï¼è¿æå³çç¨åºå®æè¿è¡åªéè¦ 2 ç§ï¼è䏿¯ 3 ç§ï¼å³è¾æ
¢ç计æ¶å¨çæ¶é´ã
å¦æä½ å¸æå¨å¹¶åæ§è¡ç两个æå¤ä¸ªä»»å¡å®æåå®å
¨å°æ§è¡å
¶ä»ä»»å¡ï¼é£ä¹å¨è¿äºä»»å¡å¼å§åï¼ä½ å¿
é¡»çå¾
对 Promise.all()
æ Promise.allSettled()
çè°ç¨ã
è¦åï¼ å½æ° sequentialWait
å concurrent1
å¨åè½ä¸å¹¶éçä»·çã
å¨ sequentialWait
ä¸ï¼å¦æè¾å¿«ç promise å
äºè¾æ
¢ç promise å
ç°åæç»ï¼åä¼åºç°æªå¤çç promise æç»éè¯¯ï¼æ 论è°ç¨è
æ¯å¦é
ç½®äº catch åå¥ã
å¨ concurrent1
ä¸ï¼Promise.all
䏿¬¡æ§å° promise é¾è¿æ¥èµ·æ¥ï¼è¿æå³çæä½å°ä¼ç«å³å¤±è´¥ï¼æ 论è¿äº promise çæç»é¡ºåºå¦ä½ï¼é误é½å°å¨é
ç½®ç promise é¾ä¸åçï¼å¹¶å¯ä»¥æç
§æ£å¸¸çæ¹å¼æè·ã
è¿å Promise
ç API å°ä¼äº§çä¸ä¸ª promise é¾ï¼å®å°å½æ°è¢è§£æè®¸å¤é¨åãä¾å¦ä¸é¢ç代ç ï¼
function getProcessedData(url) {
return downloadData(url) // è¿åä¸ä¸ª promise
.catch((e) => downloadFallbackData(url)) // è¿åä¸ä¸ª promise
.then((v) => processDataInWorker(v)); // è¿åä¸ä¸ª promise
}
å¯ä»¥ä½¿ç¨åä¸ªå¼æ¥å½æ°éåï¼å¦ä¸æç¤ºï¼
async function getProcessedData(url) {
let v;
try {
v = await downloadData(url);
} catch (e) {
v = await downloadFallbackData(url);
}
return processDataInWorker(v);
}
æè
ï¼ä½ å¯ä»¥ä½¿ç¨ catch()
é¾å¼è°ç¨ promiseï¼
async function getProcessedData(url) {
const v = await downloadData(url).catch((e) => downloadFallbackData(url));
return processDataInWorker(v);
}
以ä¸ä¸¤ä¸ªéåçæ¬ä¸ï¼è¯·æ³¨æå¨ return
å
³é®åä¹å没æ await
è¯å¥ï¼å°½ç®¡è¿ä¹æ¯ææçï¼å¼æ¥å½æ°çè¿åå¼éå¼å°è¢«å
è£
å¨ Promise.resolve
ä¸ââ妿宿¬èº«ä¸æ¯ä¸ä¸ª promise çè¯ï¼æ£å¦ä¸é¢çç¤ºä¾æç¤ºï¼ã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4