小程序中怎么优雅的捕捉异步方法的异常

小程序中怎么优雅的捕捉异步方法的异常

小编给大家分享一下小程序中怎么优雅的捕捉异步方法的异常,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

传统方法

在ES7之后,我们往往使用 async await 语法来进行异步编程,如果我们要捕捉异常的话一般有以下两种方式

小程序中怎么优雅的捕捉异步方法的异常

try catch

asyncfunc(){//dosomething}try{constres=awaitfunc()}catch(error){//handleerror}

首先是 try catch 捕捉异常,使用 try catch 确实可以很方便的去处理异常,也可以阻止后面方法的进行,但是在开发的过程中咱们常常不止一个异步方法,大量使用 try catch 不仅写的不爽,也绝对算不上优雅。

Promise.catch()

asyncfunc(){//dosomething}constres=awaitfunc().catch(error=>{//handleerror})

Promise对象内部了try catch ,我们可以使用链式调用的方法来处理异常。相比try catchPromise.catch() 写起来当然是爽很多的,看着也比较优雅了。

但是当我们想要在捕捉到错误后停止方法的继续执行,那么 Promise.catch() 就没办法做到了,如下例子

asyncfunc(){//dosomething}constres=awaitfunc().catch(error=>{//即使return也无效return})//如果有错误的话我就不执行了

优雅方式

await-to-js github链接

https://github.com/scopsy/await-to-js

await-to-js 这个库应该很多人了解过了,它是一个异步请求的包装器,可以用于处理异步请求的错误,根据我们上面的需求改造为使用 await-to-js 的例子如下

importtofrom'await-to-js';asyncfunc(){//dosomething}const[err,res]=awaitto(func())if(err){//handleerrorreturn}//如果有错误的话我就不执行了

通过将我们的异步方法作为 to() 方法的参数,返回值通过一个数组解构获取,数组第一个值为捕捉到的错误,第二个值为正常执行的返回值。

await-to-js的实现原理也非常简单,就是使用 Promise.catch()获取到异常后再将结果返回在一个数组中, 源代码如下

exportfunctionto<T,U=Error>(promise:Promise<T>,errorExt?:object):Promise<[U,undefined]|[null,T]>{returnpromise.then<[null,T]>((data:T)=>[null,data]).catch<[U,undefined]>((err:U)=>{if(errorExt){constparsedError=Object.assign({},err,errorExt);return[parsedError,undefined];}return[err,undefined];});}exportdefaultto;

小程序中使用

在小程序中,我们使用npm包并不方便,因此我们可以直接将源码拿出来单独使用,再加以改造的话就可以优雅的进行异步编程啦,我自己的改造方式如下。

//lib/awaitTo.jsmodule.exports=functionto(promise,description="unknown"){constpages=getCurrentPages()constroute=pages[pages.length-1].route||'unknown'description=`[${route}]---[${description}]`console.time(description)returnpromise.then(function(data){console.timeEnd(description)return[null,data];}).catch(function(err){wx.showToast({title:'请求失败',icon:"none"})return[err,undefined];});}

我通过 getCurrentPages() 的方式获取到异步方法执行时对应的页面路由,在将第二个参数改为自己对异步方法的一个描述,每一次调用异步方法的时候就会在 控制台输出执行时间。 实际使用的例子如下:

constto=require("../../lib/awaitTo")const[err,res]=awaitto(db.collection("post").add({data:form}),"addPost")if(err){//处理我的错误return}//成功后执行的逻辑

控制台打印的执行时间输出如下,打印格式是

【路由页面】---【方法描述】:执行时间

以上是“小程序中怎么优雅的捕捉异步方法的异常”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2021-12-22 21:55:03
收藏
分享
海报
0 条评论
33
上一篇:linux 下如何搭建php环境 下一篇:HTML5中header指的是什么意思
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码