zZZ1Ma
zZZ1Ma
  • 发布:2023-05-16 12:37
  • 更新:2024-02-29 11:11
  • 阅读:296

【拦截器】addInterceptor 如何在 invoke 内使API进入catch?

分类:uni-app
// 拦截器  
uni.addInterceptor('showToast', {  
  invoke: args => {  
    // 标题为空时,取消当前API调用  
    // 但API永远是pending状态,无法进入catch、finally  
    if (!args.title) return false  
  }  
})  

// 【需求】title为空时,可触发catch、finally  
uni.showToast({ title: '' })  
  .then(res => console.log('then', res))  
  .catch(error => console.log('catch', error))  
  .finally(() => console.log('end'))
2023-05-16 12:37 负责人:无 分享
已邀请:
DCloud_UNI_LXH

DCloud_UNI_LXH

可以通过修改 returnValue 来实现,比如:

let invoke = true;  
uni.addInterceptor('showToast', {  
    invoke(args) {  
        if (args.title === 'test') {  
            invoke = false;  
            return invoke;  
        }  
    },  
    returnValue(...args) {  
        if (!invoke) {  
            invoke = true;  
            return Promise.reject();  
        }  
    }  
});
  • zZZ1Ma (作者)

    验证可行

    2023-05-17 16:15

  • zZZ1Ma (作者)

    更新一下:invoke内throw即可触发uni.showToast().catch(...)

    2024-02-01 16:12

zZZ1Ma

zZZ1Ma (作者)

此处使用showToast模拟request,需求类似:url不符合自定义规则时,取消当前request,使其进入catch()、finally(),在finally内重置button[disabled]

BoredApe

BoredApe - 有问题就会有答案。

uni.addInterceptor('showToast', {  
    invoke(args) {  
        return new Promise((resolve, reject) => {  
            setTimeout(() => {  
                if(true){  
                resolve(args);  
               }else{  
                reject(args)  
               }    
            }, 2000);  
        });  
    },  
});
  • zZZ1Ma (作者)

    感谢回复,但仍不能在uni.showToast({ title: '' }).catch()内捕获到

    2023-05-16 13:09

要回复问题请先登录注册