当前位置: 首页 > Web前端 > HTML5

ES8(一)——async&await

时间:2023-04-05 18:49:09 HTML5

分类async和普通函数的区别awaitasync/await处理多个回调asynchronousasync和await必须配合使用关于awaitM1:try-catchM2的错误处理:.catchM3:两个返回值(参考节点)ES6-ES10学习布局async和普通函数的区别//普通函数functionfuc(){return27}console.log(fuc());//27//asyncfunctionasyncfunctionfirstAsync(){return27}console.log(firstAsync())//Promise{:27}//返回一个promise对象,返回27resolve//等价to-->asyncfunctionfirstAsync(){返回承诺。resolve(27)}firstAsync().then(val=>{console.log(val)//27})console.log(firstAsync()instanceofPromise)//true可以判断asyncawait下面函数返回的对象怎么才能按顺序执行呢?asyncfunctionfirstAsync(){//声明一个异步操作,下面的函数只有在执行完后才能执行letpromise=newPromise((resolve,reject)=>{setTimeout(()=>{resolve('nowitisdone')},1000)})//执行异步操作promise.then(val=>{console.log(val)})console.log(2)return3}firstAsync().then(val=>{console.log(val)})//2//3//现在完成使用awaitasync函数firstAsync(){//声明一个异步操作,下面的函数只有执行完才能执行letpromise=newPromise((resolve,reject)=>{setTimeout(()=>{resolve('nowitisdone')},1000)})//执行一个异步操作letresult=awaitpromiseconsole.log(result)console.log(2)return3}firstAsync().then(val=>{console.log(val)})//现在是done//2//3awaitpromise是一个表达式,后面是一个promise对象,如果没有自动处理成promise对象console.log(awaitpromise)//nowisdone---hasareturnvalueconsole.log(await40)//40console.log(awaitpromise.resolve(40))//40async/await处理多回调异步ES2017提供的async/await是一种标准的异步编程语法。如果遇到多回调promise,可以使用async/来简化/Promisechainajax('/api/url1').then(value=>{returnajax('ajax/url2')}).then(value=>{returnajax('ajax/url3')}).then(value=>{returnajax('ajax/url4')}).catch(error=>{console.error(error)})上面的代码可以可以这样写,效果和语法和generator一样,不需要定义Actuator,简单方便,推荐asyncfunctionmain(){try{constusers=awaitajax('/api/users.json')console.log(users)constposts=awaitajax('/api/posts.json')console.log(posts)consturls=awaitajax('/api/urls.json')console.log(urls)}catch(e){//捕获异常console.log(e)}}main()async和await必须一起使用否则会Errorhandlingabouterrorsintheuseofawait如果不对await进行错误处理,程序的执行就会被阻塞。在await的使用中,如果promise对象返回resolve,返回什么值就是什么值,包括undefined。但是如果返回reject,返回值返回undefined,可以从catch函数中接收。第一种处理方式:try-catch优点:简洁明了,所有的错误都在catch中处理,不需要判断await的返回值缺点:try-catch本身处理同步报错的问题,如果有错误await函数之后,则无法判断错误来源//定义一个返回promise对象的函数functionfirstAsync(){returnnewPromise((resolve,reject)=>{consta=0;if(a){resolve(1)}else{reject(2)}})}asyncfunctionhello(){//判断是否出错try{constres=awaitfirstAsync()console.log(res)}catch(err){console.log("err")console.log(err)}}第二种处理方式:.catch优点:代码优雅,适用于await函数的异步错误处理缺点:需要重新判断返回值。//定义一个返回promise对象的函数functionfirstAsync(){returnnewPromise((resolve,reject)=>{consta=0;if(a){resolve(1)}else{reject(2)}})}asyncfunctionhello(){//判断是否有错误constres=awaitfirstAsync().catch(err=>{console.log("err")console.log(err)})if(res){//TODO}}你好();第三种处理方法有两个返回值。优点:可以在定义的函数内执行统一的错误处理。await调用只需要判断返回值,不需要单独的catch处理。缺点:返回值为两个,不好管理constawaitWrap=()=>{letpromise=newPromise((resolve,reject)=>{consta=0;if(a){resolve(1)}else{reject(2)}})returnpromise.then(data=>[data,null]).catch(err=>{//一般错误处理写在这里TODOreturn[null,err]})}asyncfunctionhe(){const[数据,错误]=awaitawaitWrap();if(data){//如果是reslovegohereconsole.log(data)}else{//如果是rejectgohereconsole.log("error")console.log(err)//特殊错误处理write这里TODO}}he();ES6-ES10学习布局