ES2017 标准引入了 async
函数,使得异步操做变得更加方便。async
顾名思义是“异步”的意思,用于声明一个函数是异步的。而await
从字面意思上是“等待”的意思,就是用于等待异步完成。promise
既然async
函数是声明一个异步函数,那么咱们如何知道这个函数是否执行完成呢。咱们观察一下async
函数的返回值就明白了。异步
async function lxcAsync() { return "LXC"; } console.log(lxcAsync()); // Promise { 'LXC' }
代码输出的结果是Promise { 'LXC' }
,可见async
函数返回的是一个Promise对象,所以咱们能够使用then方法添加回调函数,从而处理async
函数返回的结果。async
async function lxcAsync() { return "LXC"; } lxcAsync().then((data) => { console.log(data); // LXC });
正常状况下,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
的异步测试就有这种需求),咱们能够使用下列方式code
function lxcAsync() { setTimeout(async () => { await 1; },1000) } lxcAsync();
若是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();