async function

async function 声明了一个异步函数,并返回了一个 AsyncFunction 对象。
 

也可以通过用 AsyncFunction 构造器或者一个async function 表达式去定义一个异步的函数。

语法

async function name([param[, param[, ... param]]]) {
   statements
}
name
方法的名字。
param
传递给方法的参数名。
statements
方法体的语句。

描述

调用异步函数时会返回一个 promise 对象。当这个异步函数返回一个值时,promise 的 resolve 方法将会处理这个返回值;当异步函数抛出的是异常或者非法值时,promise 的 reject 方法将处理这个异常值。

异步函数可能会包括  await 表达式,这将会使异步函数暂停执行并等待 promise 解析传值后,继续执行异步函数并返回解析值。

例如

简单例子

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.
});

通过异步方法重写 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 function getProcessedData(url) {
  let v:
  try {
    v = await downloadData(url); 
  } catch (e) {
    v = await downloadFallbackData(url);
  }
  return processDataInWorker(v);
}

注意,在上面的例子中返回语句中没有 await ,因为 Promise.resolve 会隐式包裹异步方法的返回值。

规范

Specification Status Comment
ECMAScript Async Functions
async function
Draft Proposal

兼容性

Feature Chrome Firefox (Gecko) Internet Explorer  Edge Opera Safari (WebKit)
Basic support 55 52.0 (52.0) ? ? 42 ?
Feature Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support 未实现 未实现 52.0 (52.0) ? 42 ? 55

 

参见

文档标签和贡献者

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