async-function-await

async-function-await

语法

1
async function name([param[, param[, ... param]]]) { statements }

返回值

一个返回的Promise对象会以async function的返回值进行解析(resolved),或者以该函数抛出的异常进行回绝(rejected)。

描述

当调用一个 async 函数时,会返回一个 Promise 对象。

  1. 当这个 async 函数返回一个值时,Promiseresolve 方法会负责传递这个值;
  2. async 函数抛出异常时,Promisereject 方法也会传递这个异常值。

async 函数中可能会有 await 表达式,这会使 async 函数暂停执行,等待 Promise 的结果出来,然后恢复async函数的执行并返回解析值(resolvedreject)。

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

async/await的用途是简化使用 promises 异步调用的操作,并对一组 Promises执行某些操作。
正如Promises类似于结构化回调,async/await类似于组合生成器和 promises

不要将awaitPromise.then混淆

示例

通过async方法重写 promise 链

返回 Promise的 API 将会被用于 promise 链,它会将函数分成若干部分。例如下面代码:

1
2
3
4
5
6
7
8
9
function getProcessedData(url) {
return downloadData(url) // 返回一个 promise 对象
.catch(e => {
return downloadFallbackData(url) // 返回一个 promise 对象
})
.then(v => {
return processDataInWorker(v); // 返回一个 promise 对象
});
}

可以通过如下所示的一个async函数重写:

1
2
3
4
5
6
7
8
9
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

await

await 操作符用于等待一个Promise 对象。它只能在异步函数 async function 中使用。

语法

1
[return_value] = await expression;

表达式
一个 Promise 对象或者任何要等待的值。
返回值
返回 Promise 对象的处理结果。如果等待的不是 Promise 对象,则返回该值本身。

描述

await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成。

  1. Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的值,继续执行 async function
  2. Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出。

另外,如果 await 操作符后的表达式的值不是一个 Promise则返回该值本身。 (await不会包装值为Promise)