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 г..
ÐбÑÑвление async function опÑеделÑÐµÑ Ð°ÑинÑ
ÑоннÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ AsyncFunction.
ÐÑ Ñакже можеÑе опÑеделиÑÑ async-ÑÑнкÑии, иÑполÑзÑÑ Ð²ÑÑажение async function.
СинÑакÑиÑ
async function name([param[, param[, ... param]]]) {
statements
}
name-
ÐÐ¼Ñ ÑÑнкÑии.
param-
ÐÐ¼Ñ Ð°ÑгÑменÑа, коÑоÑÑй бÑÐ´ÐµÑ Ð¿ÐµÑедан в ÑÑнкÑиÑ.
statements-
ÐÑÑажение, ÑодеÑжаÑее Ñело ÑÑнкÑии.
ÐпиÑание
ÐоÑле вÑзова ÑÑнкÑÐ¸Ñ async возвÑаÑÐ°ÐµÑ Promise. Ðогда ÑезÑлÑÑÐ°Ñ Ð±Ñл полÑÑен, Promise завеÑÑаеÑÑÑ, возвÑаÑÐ°Ñ Ð¿Ð¾Ð»ÑÑенное знаÑение. Ðогда ÑÑнкÑÐ¸Ñ async вÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение, Promise оÑвеÑÐ¸Ñ Ð¾Ñказом Ñ Ð²ÑбÑоÑеннÑм (throws) знаÑением.
ФÑнкÑÐ¸Ñ async Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð²ÑÑажение await, коÑоÑое пÑиоÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð²Ñполнение ÑÑнкÑии async и Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð¾ÑвеÑа Ð¾Ñ Ð¿ÐµÑеданного Promise, заÑем возобновлÑÑ Ð²Ñполнение ÑÑнкÑии async и возвÑаÑÐ°Ñ Ð¿Ð¾Ð»ÑÑенное знаÑение.
ÐлÑÑевое Ñлово await допÑÑÑимо ÑолÑко в аÑинÑ
ÑоннÑÑ
ÑÑнкÑиÑÑ
. РдÑÑгом конÑекÑÑе Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе оÑÐ¸Ð±ÐºÑ SyntaxError.
ÐÑимеÑание:
Ð¦ÐµÐ»Ñ ÑÑнкÑий async/await ÑпÑоÑÑиÑÑ Ð¸ÑполÑзование promises ÑинÑ
Ñонно и воÑпÑоизвеÑÑи некоÑоÑое дейÑÑвие над гÑÑппой Promises. ТоÑно Ñак же как Promises Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñ ÑÑÑÑкÑÑÑиÑованнÑм колбÑкам, async/await подобна комбинаÑии генеÑаÑоÑов и promises.
ÐÑимеÑÑ
>ÐÑоÑÑой пÑимеÑ
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 a = resolveAfter2Seconds(20);
const b = resolveAfter2Seconds(30);
return x + (await a) + (await b);
}
add2(10).then((v) => {
console.log(v); // prints 60 after 2 seconds.
});
ÐÑедÑпÑеждение:
Ðе пÑÑайÑе await и Promise.allФÑнкÑÐ¸Ñ add1 пÑиоÑÑанавливаеÑÑÑ Ð½Ð° 2 ÑекÑÐ½Ð´Ñ Ð´Ð»Ñ Ð¿ÐµÑвого await и еÑÑ Ð½Ð° 2 Ð´Ð»Ñ Ð²ÑоÑого. ÐÑоÑой ÑÐ°Ð¹Ð¼ÐµÑ ÑоздаÑÑÑÑ ÑолÑко поÑле ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð¿ÐµÑвого. Ð ÑÑнкÑии add2 ÑоздаÑÑÑÑ Ð¾Ð±Ð° и оба же пеÑеÑ
одÑÑ Ð² ÑоÑÑоÑние await. Ð ÑезÑлÑÑаÑе ÑÑнкÑÐ¸Ñ add2 завеÑÑиÑÑÑ ÑкоÑее ÑеÑез две, Ñем ÑеÑез ÑеÑÑÑе ÑекÑндÑ, поÑколÑÐºÑ ÑаймеÑÑ ÑабоÑаÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно. Ðднако запÑÑкаÑÑÑÑ Ð¾Ð½Ð¸ вÑÑ Ð¶Ðµ не паÑаллелÑно, а дÑÑг за дÑÑгом - ÑÐ°ÐºÐ°Ñ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¸Ñ Ð½Ðµ ознаÑÐ°ÐµÑ Ð°Ð²ÑомаÑиÑеÑкого иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Promise.all. ÐÑли два или более Promise Ð´Ð¾Ð»Ð¶Ð½Ñ ÑазÑеÑаÑÑÑÑ Ð¿Ð°ÑаллелÑно, ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Promise.all.
Ðогда ÑÑнкÑÐ¸Ñ async вÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение
async function throwsValue() {
throw new Error("oops");
}
throwsValue().then(
(resolve) => {
console.log("resolve:" + resolve);
},
(reject) => {
console.log("reject:" + reject);
},
);
//prints "reject:Error: oops"
//or
throwsValue()
.then((resolve) => {
console.log("resolve:" + resolve);
})
.catch((reject) => {
console.log("reject:" + reject);
});
//prints "reject:Error: oops"
ÐеÑепиÑÑ ÑепоÑки promise Ñ Ð¸ÑполÑзованием ÑÑнкÑии async
API, коÑоÑое возвÑаÑÐ°ÐµÑ 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:
async function getProcessedData(url) {
let v;
try {
v = await downloadData(url);
} catch (e) {
v = await downloadFallbackData(url);
}
return processDataInWorker(v);
}
ÐамеÑÑÑе, ÑÑо пÑÐ¸Ð¼ÐµÑ Ð²ÑÑе не ÑодеÑÐ¶Ð¸Ñ await на return, поÑÐ¾Ð¼Ñ ÑÑо возвÑаÑаемое знаÑение ÑÑнкÑии async неÑвно обÑÑнÑÑо в Promise.resolve.
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-async-function-definitions> |