async function
async function 函数声明将定义一个异步函数,返回AsyncFunction对象。
你还可以使用 async function 函数表达式 来定义异步函数。
语法
async function name([param[, param[, ... param]]]) {
statements
}参数
name函数名称。param要传递给函数的参数的名称。statements函数体语句。
返回值
一个AsyncFunction对象,表示一个异步函数。
描述
调用async函数时会返回一个Promise对象。当这个 async函数返回一个值时,Promise的 resolve 方法会负责传递这个值;当async函数抛出异常时,Promise的 reject 方法也会传递这个异常值。
async函数中可能会有await表达式,这会使async函数暂停执行,等待表达式中的 Promise 解析完成后继续执行async函数并返回解决结果。
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 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.
});通过async方法重写 promise 链
返回Promise的 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);
}注意,在上述示例中,return语句中没有await操作符,因为async function的返回值将隐式传递给Promise.resolve。
规范
Specification | Status | Comment |
|---|---|---|
ECMAScript Latest Draft (ECMA-262)The definition of 'async function' in that specification. | Living Standard | Initial definition in ES2017. |
ECMAScript 2017 (ECMA-262)The definition of 'async function' in that specification. | Standard | |
浏览器兼容性
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
|---|---|---|---|---|---|---|
Basic support | 55 | (Yes) | 52.0 (52.0) | ? | 42 | 10.1 |
Feature | Android | Android Webview | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
|---|---|---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | 52.0 (52.0) | ? | 42 | 10.1 | 55 |
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com

