这篇翻译不完整。请帮忙从英语翻译这篇文章

 async function 声明将定义一个返回 AsyncFunction 对象的异步函数。
 

你还可以使用 异步函数表达式 来定义异步函数。

语法

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

返回值

返回的Promise对象会以async function的返回值进行resolve,或者以该函数抛出的异常进行reject。

描述

当调用一个 async 函数时,会返回一个 Promise 对象。当这个 async 函数返回一个值时,Promise 的 resolve 方法会负责传递这个值;当 async 函数抛出异常时,Promise 的 reject 方法也会传递这个异常值。

async 函数中可能会有 await 表达式,这会使 async 函数暂停执行,等待表达式中的 Promise 解析完成后继续执行 async 函数并返回解决结果。

    注意, await 关键字仅仅在 async function中有效。如果在 async function函数体外使用 await ,你只会得到一个语法错误(SyntaxError)。

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 = await resolveAfter2Seconds(20); 
  var b = await resolveAfter2Seconds(30); 
  return x + a + b; 
}
 
add1(10).then(v => { 
  console.log(v); // prints 60 after 4 seconds. 
});

async function add2(x) {
  var a = resolveAfter2Seconds(20);
  var b = resolveAfter2Seconds(30);
  return x + await a + await b;
}

add2(10).then(v => {
  console.log(v);  // prints 60 after 2 seconds.
});

不要将awaitPromise.all混淆

在函数add1中,程序为第一个await停留了2秒, 然后为第二个await又停留了2秒。第一个计时器结束后,第二个计时器才被创建。在函数add2中,两个计时器均被创建,然后一起被await。 这导致程序运行出结果需要2秒而非4秒,因为这两个计时器是同时运行的。但是这两个await调用仍然是串行而非并行的:Promise.all并没有自动做这种操作。如果你想要同时await两个或者更多Promise对象,必须使用Promise.all

通过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
Draft Initial definition in ES2017.
ECMAScript 2017 (ECMA-262)
async function
Standard  

浏览器兼容

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic support55 Yes52 No4210.1
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Basic support Yes55 Yes524210.16.0

参见

文档标签和贡献者

最后编辑者: Jessy.D.,