Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.
ункции async определяет асинхронную функцию, которая возвращает объект AsyncFunction.Вы также можете определить функции async, используя async function expression.
Syntax
async function name([param[, param[, ... param]]]) {
statements
}
name- Имя функции.
param- Имя аргумента, который будет передан в функцию.
statements- Утверждение, содержащее тело функции.
Описание
После вызова, функция async возвращает Promise. Когда результат был получен, Promise завершается, возвращая полученное значение. Когда функция async выбрасывает исключение, Promise ответит отказом с выброшенным (throws) значением.
Функция async может содержать выражение await, которое приостанавливает выполнение функции async и ожидает ответа от переданного Promise, затем возобновляя выполнение функции async и возвращая полученное значение.
Цель функций async/await упросить использование promises синхронно и воспроизвести некторое действие над группой Promises. Точно так же как Promises подобны структурированным callback-ам, async/await подобна комбинации генераторов и promises.
Примеры
Простой пример
function resolveAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function add1(x) {
var a = resolveAfter2Seconds(20);
var b = resolveAfter2Seconds(30);
return x + await a + await b;
}
add1(10).then(v => {
console.log(v); // prints 60 after 2 seconds.
});
async function add2(x) {
var a = await resolveAfter2Seconds(20);
var b = await resolveAfter2Seconds(30);
return x + a + b;
}
add2(10).then(v => {
console.log(v); // prints 60 after 4 seconds.
});
Когда функция 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 | Status | Comment |
|---|---|---|
| ECMAScript 2017 Draft (ECMA-262) Определение 'async function' в этой спецификации. |
Черновик | Initial definition in ES2017. |
Поддержка браузерами
| Feature | Chrome | Firefox (Gecko) | Internet Explorer | Edge | Opera | Safari (WebKit) |
|---|---|---|---|---|---|---|
| Basic support | 55 | 52.0 (52.0) | ? | ? | 42 | 10.1 |
| Feature | Android | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
|---|---|---|---|---|---|---|---|
| Basic support | Нет | Нет | 52.0 (52.0) | ? | 42 | 10.1 | 55 |