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) {
  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方法重写 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
        }); 
    })
    .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)
async function
Living Standard Initial definition in ES2017.
ECMAScript 2017 (ECMA-262)
async function
Standard  

浏览器兼容

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic support55 Yes52 No4210.1
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
Basic support Yes55 Yes52 No4210.1

参见

文档标签和贡献者

 此页面的贡献者: shhider, zhangchen, xgqfrms-GitHub, _da, Katherina-Miao
 最后编辑者: shhider,