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

规范

SpecificationStatusComment
ECMAScript Latest Draft (ECMA-262)The definition of 'async function' in that specification.Living StandardInitial definition in ES2017.
ECMAScript 2017 (ECMA-262)The definition of 'async function' in that specification.Standard

浏览器兼容性

FeatureChromeEdgeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
Basic support55(Yes)52.0 (52.0)?4210.1

FeatureAndroidAndroid WebviewEdgeFirefox Mobile (Gecko)IE MobileOpera MobileSafari MobileChrome for Android
Basic support(Yes)(Yes)(Yes)52.0 (52.0)?4210.155