使用promise封装的时候,使用了全局拦截,怎么针对个别请求重新拦截呢?

发布于 2022-09-12 04:46:22 字数 538 浏览 25 评论 0

return new Promise((resolve, reject) => {
    wx.request({
        url: API_URL + url,
        success: function (res) {
            if (res.data.code == 200) {
                
            }
            else {
                reject(res.data.msg)
            }
        },
        fail: function (e) {
            reject('request fail')
        }
    })
}).catch(err => {
    console.warn('error for debugger')
})

如题,promise是不是每一个都要写一个catch,如果请求有几百个,是不是只能写几百个catch,有没有什么办法可以全局catch完之后,针对某一个请求写特定的catch?

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

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

发布评论

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

评论(2

冰雪之触 2022-09-19 04:46:22
  • 根据业务逻辑需要,按返回的数据code来决定哪些需要全局拦截,那么全局忽略,开发给具体请求具体处理
  • 出入具体的参数,来决定是否需要全局拦截
var IGNOR_INTERCEPT_CODES=[300,400,500...];
function wx_request(url,autoHandleFlag=true){
    return new Promise((resolve, reject) => {
        wx.request({
            url: API_URL + url,
            success: function (res) {
                if (res.data.code == 200) {
                    resolve({
                        code:res.data.code,
                        data:res.data,
                        msg:'',
                    });
                }
                else {
                    if(!autoHandleFlag){
                        resolve({
                            code:res.data.code,
                            data:null,
                            msg:res.data.msg
                        });
                    }else{
                        if(IGNOR_INTERCEPT_CODES.indexOf(res.data.code)!==-1){
                            resolve({
                                code:res.data.code,
                                data:null,
                                msg:res.data.msg
                            });
                        }else{
                            reject(res.data.msg)
                        }
                    }
                    
                    
                }
            },
            fail: function (e) {

                if(!autoHandleFlag){
                    resolve({
                        code:-1,
                        data:null,
                        msg:e,
                    });
                }else{
                   // 此处处理系统级别的错误,也可以按消息类型决定是否直接reject还是resovle返回数据给调用方
                    reject('request fail')
                }
                
            }
        })
    }).catch(err => {
        console.warn('error for debugger')
    });
}
岁月染过的梦 2022-09-19 04:46:22

reject时将url也带入,返回一个对象。catch中根据url处理,可以封装成策略模式来实现。

const handleError = {
    '/a': () => {
    },
    '/b': () => {
    }
}

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