2***@163.com
2***@163.com
  • 发布:2024-11-13 19:20
  • 更新:2024-11-20 10:09
  • 阅读:57

#插件讨论# 【 常用工具方法 - hbxw 】如何在请求拦截器中执行异步的任务后,重新请求

分类:uni-app
关联插件: 常用工具方法
//基础参数配置  
request.requestIntercept.add(  
    (requestConfig) => {  
        //添加头部参数  
        requestConfig.header.apiName = 'wxapp'  
        let reqToken = uni.getStorageSync(tokenConfig.localTokenKeyName)  
        if (!reqToken || reqToken == '') {  
            getToken().then((res)=>{      
                requestConfig.header.token = res  
                return request.request(requestConfig.url,requestConfig.data) ;  // 注意返回请求  
            })  
            return true  
        } else {  
            requestConfig.header.token = reqToken  
        }  
    },  
);

在请求拦截器中,写了一个自动获取token 的方法,就是本地没有的话,用getToken() 异步的去取一个,然后放到header 头当中,然后重新请求上一次的方法,
但是这样写,在页面内调用的话,

return  request.request(requestConfig.url,requestConfig.data) ;  // 注意返回请求

页面内的返回值一直是 undefined
麻烦大佬抽空可以帮忙看下
18937777307

2024-11-13 19:20 负责人:无 分享
已邀请:
2***@163.com

2***@163.com (作者) - 27mv

昨天查了一下,
async 函数不管怎么样,都返回的是 promise 对象?

    console.log('-----------fnReturns--------')  
            console.log(fnReturns)  
            requestInterceptPrevent = fnReturns.some(fnReturn =>fnReturn);

原本的拦截器判断 返回值 为 true 的情况是这样写的,导致返回的promise 对象 也认定为true ,导致程序不向下执行,

后来改成
requestInterceptPrevent = fnReturns.some(fnReturn =>fnReturn === true);
判断问题解决,感谢你的插件

hbxw

hbxw

//基础参数配置    
request.requestIntercept.add(    
    async (requestConfig) => {    
      //添加头部参数    
      requestConfig.header.apiName = 'wxapp'    
      let reqToken = uni.getStorageSync(tokenConfig.localTokenKeyName)    
      if (!reqToken || reqToken == '') {  
        try {  
          const res = await getToken();  
          requestConfig.header.token = res;     
        } catch (err){  
          return true;  
        }    
      } else {    
        requestConfig.header.token = reqToken;  
      }    
    },    
);

试试这一个

2***@163.com

2***@163.com (作者) - 27mv

按照你的写法,
//基础参数配置

request.requestIntercept.add(      
    async (requestConfig) => {      
      //添加头部参数      
      requestConfig.header.apiName = 'wxapp'      
      let reqToken = uni.getStorageSync(tokenConfig.localTokenKeyName)      
      if (!reqToken || reqToken == '') {    
        try {    
          const res = await getToken();    
          requestConfig.header.token = res;       
          console.log(res)  
        } catch (err){   
            console.log(err)  
          return true;    
        }      
         console.log(7777)  
      } else {      
        requestConfig.header.token = reqToken;    
      }      
    },      
);

token 的res 结果可以打印出来,
777这几个也能打印出来,但是就没有后面的请求了,网络请求面板里面也只有 获取token的一条网络请求,我的理解 中只要不返回true,应该都会继续执行下面的网络请求,

hbxw

hbxw

request.requestIntercept.add(        
    async (requestConfig) => {        
      //添加头部参数        
      requestConfig.header.apiName = 'wxapp'        
      let reqToken = uni.getStorageSync(tokenConfig.localTokenKeyName)        
      if (!reqToken || reqToken == '') {      
        try {      
          const res = await getToken();      
          requestConfig.header.token = res.data.cacheName;// 你这个token都不是直接返回,要从这里在取         
          console.log(res)    
        } catch (err){     
            console.log(err)    
          return true;      
        }        
         console.log(7777)    
      } else {        
        requestConfig.header.token = reqToken;      
      }        
    },        
);

试一下这个,再不行,我远程帮你看一下?

hbxw

hbxw

插件已做优化,你目前场景可直接使用

要回复问题请先登录注册