1.async函数
说明:
- 通常就是Generator函数的语法糖,async函数自带执行器,也就是说,async函数的执行,与普通函数使用一样。
- 语义化,加上async函数表示时异步操作,await表示需要等待结果。
- 通用性,async函数的await命令后面,可以是Promise对象和原始类型的值。
- 返回值时Promise,async函数的返回值是Promise对象。
2.用法
async function fun(name){// 获取用户的名字const userName=fun1(name)//获取密码const passWord=fun2(password)return userName}fun("good").then(result=>{console.log(result);})
注意:上面是一个获取用户名的函数,函数前的async关键字,表示该内部有个异步操作。当用该函数的时候会返回一个promise对象。
2.1例子
async function timeout(time){await new Promise(resolve=>{setTimeout(() => {resolve()}, time);}) }async function asyncOutput(value,time){await timeout(time)await console.log(value);}asyncOutput("hello world",2000)
注意:当两秒过后,输出hello world。
3.语法
说明:async函数的语法规则总体简单,但是难以发现错误。 返回Promise对象,async函数内部return语句返回的值,会成为then方法回到函数的参数。
async function fun1(){return 'study repeatly'};fun1().then(result=>{console.log(result); //study repeatly})async function fun2(){throw new Error("出错了")}fun2().then(result=>{console.log(result);}).catch(error=>{console.log(error); //出错了})
注意:总结:函数内部return命令返回的值,会被then方法回调函数收到,async函数内部抛出错误,会导致返回的Promise对象变成reject状态。错误将会被catch方法回调函数接收到。
4. Promise对象的状态变化
说明:async函数返回的Promise对象,必须等到内部所有await命令后面的Promise对象执行后,才会发生改变,除非遇到return语句或者抛出错误。只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。
5.await命令
说明:正常情况下,await命令后面是一个Promise对象,返回该对象的结果。如果不是就直接返回对应的值。
async function fun3(){return await 132 //等同于return 132}fun3().then(result=>{console.log(result); //132})
5.1例子
说明:任何一个await语句后面的Promise对象变成了reject状态,那么整个async函数都会中断执行。
async function fun4(){await Promise.reject("发生错误")await 123}fun4().then(result=>{console.log(result); //发生错误})
5.2例子
说明:如果前一个异步操作失败,也不要中断后面的异步操作。
async function fun5(){try {await Promise.reject("发生错误")} catch (error) {console.log(error);}return await Promise.resolve("successful") //控制权交还给异步函数}fun5().then(resolve=>{console.log(resolve); //successful}).catch(error=>{console.log(error);})
5.3例子
说明: await命令后面的Promise对象,运行结果可能是rejected(会抛出一个错误),所以最好把await命令放在try...catch代码块中。
async function fun6(){try{await getfun();}catch(error){console.log(error);}}// 第二种写法async function fun7(){await getfun1().catch(error=>{console.log(error);})}
6.async函数实现原理
说明: async函数的实现原理,就是将Generator函数和自动执行器,包装在一个函数里面。
7.应用
说明:async实现部署了一系列动画,动画前一个结束才可以开始后一个动画,如果有一个动画出错,就不再往下执行,返回上一个成功执行的动画的返回值。
async function continueAnimations(element,animations){let ret=nulltry{for(let action of animations){ret=await anim(action)}}catch(error){console.log(error);}return ret}
8.顶层await
说明:await命令可以在模块的顶层使用await命令。
const data=await fetch("url")
注意:主要目的是使用await解决模块异步加载的问题。