Baseline Widely available
ÐбÑÑвление 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
.
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