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

samllseapig
  • 2
新手上路,请多包涵
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?

回复
阅读 1.1k
2 个回答
✓ 已被采纳
  • 根据业务逻辑需要,按返回的数据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')
    });
}

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

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

...
catch(e) {
    handleError[e.url]();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏