什么是async
async的意思是“异步”,顾名思义就是无关异步操作的关键字,async 是 ES7 才有的,与咱们之前说的Promise、Generator有很大的关联。
应用语法:
async function name(param){
param //传递给函数的参数名称
statements //函数体
}
name().then(function(res){
res//异步操作返回的后果
})
async 函数返回一个Promise对象,能够应用then办法增加回调函数。具体实例如下:
async function show(){ return {a:12,b:15}}console.log(show())//Promise {<fulfilled>: {…}}show().then(res=>{ console.log("res",res)})
什么是await
await关键字存在async函数表达式中,用于期待Promise对象,暂停执行,等到异步操作实现后,复原async函数的执行并返回解析值。如果把await放在asnyc函数体外,会报语法错误。
应用语法:
asnyc function name(){
returnValue = await expression;
}
expression 是一个Promise对象或一个须要期待的值,针对所跟不同表达式,有两种解决形式:
对于Promise对象,await会阻塞主函数执行,期待Promise对象执行resolve之后,resolve返回值作为await表达式运算后果,而后持续向下执行。
对于非Promise对象,能够是字符串、布尔值、数值以及一般函数等。await间接返回对应的值,而不是期待其执行后果。
await期待Promise对象实例如下:
async function test1(){ console.log("执行") return new Promise((resolve,reject)=>{ setTimeout(()=>{ console.log("提早3秒之后返回胜利") resolve({a:'1'}) },3000) }) }async function test2(){ let x = await test1() console.log("x",x)//{a: "1"} return x}test2().then(function(res){ console.log("res",res)//{a: "1"}})
await 跟 一般函数 实例如下:
function test3(){ console.log("一般函数")}async function test4(){ await test3() console.log("间接执行")}test4()
捕捉异样
上述的await后跟Promise对象,咱们晓得Promise有两种状态,resolved() 和 rejected() ,如果Promise对象变为rejected,会如何解决?
function testAwait(){ return Promise.reject("error");}async function test1(){ await testAwait(); console.log("test1");//没有打印}test1().then(v=>{ console.log(v);}).catch(e=>{ console.log(e);//"error"})
从上实例执行后果发现,返回的reject状态被外层的catch捕捉,而后终止了前面的执行。然而在有些状况下,即便出错了咱们还是继续执行,而不是中断,此时咱们借助try...catch捕捉外部异样。
function test1(){ return new Promise((resolve,reject)=>{ reject("error") })}async function test2(){ try{ await test1() }catch(e){ console.log("报错",e) }}test2().then((res)=>{ console.log("执行胜利",res) // 打印:执行胜利undefined}).catch(err=>{ console.log('err',err)})
Generator与async比照:
- async利用await阻塞原理,代替了Generator的 yield 。
- async 相比Generator 不须要 run 流程函数,完满地实现了异步流程。
从 Promise 到 Generator , 再到 async ,对于异步编程的解决方案越来越完满,这就是ES6一直倒退的魅力所在。