什么是Async、await
ES2017 标准引入了 async
函数,使得异步操作变得更加方便。async
顾名思义是“异步”的意思,用于声明一个函数是异步的。而await
从字面意思上是“等待”的意思,就是用于等待异步完成。
基本用法
async函数的返回值
既然async
函数是声明一个异步函数,那么我们如何知道这个函数是否执行完成呢。我们观察一下async
函数的返回值就明白了。
async function lxcAsync() { return "LXC";}console.log(lxcAsync()); // Promise { 'LXC' }
代码输出的结果是Promise { 'LXC' }
,可见async
函数返回的是一个Promise对象,因此我们可以使用then方法添加回调函数,从而处理async
函数返回的结果。
async function lxcAsync() { return "LXC";}lxcAsync().then((data) => { console.log(data); // LXC});
await的作用
正常情况下,await
命令后面是一个 Promise
对象。当然也可以是原始类型和非Promise对象,但会被转成一个立即resolve
的 Promise
对象,这是等同于同步操作。await
表示函数等待promise
返回结果了,再继续执行。
function delay() { return new Promise((resolve) => { setTimeout(() => { resolve('LXC'); }, 2000); })}async function lxcAsync() { let de = await delay(); console.log(de); // 2s后输出LXC}lxcAsync();
注意点
await
关键字只能用于async
函数执行上下文中。
async function lxcAsync() { setTimeout(() => { await 1; //await is only valid in async function },1000)}lxcAsync();
上面便是一种错误用法,await并没有在lxcAsync
函数执行上下文中,而是在setTimeout
的回调函数中。
async function lxcAsync() { setTimeout(() => { await 1; //await is only valid in async function },1000)}lxcAsync();
如果我们希望在某个异步函数的回调函数中使用await
(如果使用过jest
,应该会知道jest
的异步测试就有这种需求),我们可以使用下列方式
function lxcAsync() { setTimeout(async () => { await 1; },1000)}lxcAsync();
reject错误处理
如果await
后面的Promise
对象返回的是reject
,那么我们需要如何处理呢?这时我们需要try-catch
来处理。
function delay() { return new Promise((resolve, reject) => { reject('LXC'); })}async function lxcAsync() { try { let de = await delay(); console.log(de); } catch (error) { console.log(error); //输出LXC }}lxcAsync();