如何合理的封装一个Promise对象?

发布于 2022-09-06 20:14:29 字数 1274 浏览 19 评论 0

现在有如下方法:

isProvid(){
  return this.$store.dispatch('isSupported')
}

该方法只考虑正确返回的情况,因为其他异常通过axios的拦截器里面处理掉了,返回值里面包含一个code,如果code不为空,表示有业务错误,需要前端提示,否则表示正确。

现在有三个地方需要调用该方法,如果有错误(code不为空),所有调用方法的错误处理方式都一样——弹出alert就好,如果正确,有两个调用的地方需要自行处理,如下:

//第一处调用
this.isProvid().then(res => {
    //处理A逻辑
})
//第二处调用
this.isProvid().then(res => {
    //处理B逻辑
})
//第一处调用(不处理任何逻辑)
this.isProvid()

那么,isProvid应该如何封装呢?

自己的思路

isProvid(){
    return this.$store.dispatch('isProvid').then(res => {
        let code = res.data.code;
        if(!code){//code不为空,表示有错误信息
            alert('弹出根据code对应的错误信息')
            return Promise.reject()//不需要返回错误信息,因为这里已经集中处理了
        }else{
            //如果正确,不返回任何东西,因为调用方不需要根据返回值来判断
            return Promise.resolve() 
        }
    })
}

注意:三个调用方都是以then方式来调用isProvid方法

疑问如下:
1、这么写正确么?
2、return this.$store.dispatch('isProvid')返回的就是promise,但是then里面又包含了return Promise返回promise对象,是什么意思呢?(看到有人这么写,但是不知道这么写正确不)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

dawn曙光 2022-09-13 20:14:29

如果 this.$store.dispatch('isProvid') 是一个promise你完全可以这么写, 效果如你写的是一样的:

isProvid(){
    return this.$store.dispatch('isProvid').then(res => {
        let code = res.data.code;
        if(!code){//code不为空,表示有错误信息
            alert('弹出根据code对应的错误信息')
            throw "";
        }
    })
}

但你这样写,多次调用其实是浪费的, 甚至出现多个(alert)报错, 更好一点的做法是你并不需要isProvid方法:

let emptFn = ()=>{}; //定义一个空错误处理函数,用来除警告;

//第一处调用(不处理任何逻辑,只用来报错)
this.isProvid = this.$store.dispatch('isProvid').then(res => {
    let code = res.data.code;
    if(!code){//code不为空,表示有错误信息
        alert('弹出根据code对应的错误信息')
        throw "";
    }
});
//isProvid 不是一个方法 就是一个promise对像


this.isProvid.then(res => {
    //处理A逻辑
},emptFn)

this.isProvid.then(res => {
    //处理B逻辑
},emptFn)
以可爱出名 2022-09-13 20:14:29

想象成一个序列

promise1.then(() => promise2).then(() => promise3)

则为执行完promise1后再执行promise2,然后再执行promise3

小耗子 2022-09-13 20:14:29

谢邀,这么写没问题的。或者 else 去掉都可以。

无力看清 2022-09-13 20:14:29

按照你目前的封装没有问题的啊,只不过每个 .isProvid() 都会调用一个 .dispatch()

如果你是希望每个 .isProvide() 都返回的是对同一个 .dispatch() 的结果,那可以参考 jQuery Promise 的 done() 事件。Promise 的 then 链会改动对象主体,需要采用事件的方式来实现对同一个主体注册多个处理函数。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文