async function
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 |