帖子
帖子
用户
博客
课程
显示全部楼层
13
帖子
0
勋章
139
Y币

[多端开发] Promise.reject(error)阻塞页面

[复制链接]
发表于 2024-5-22 21:45:36
本帖最后由 BIP538741 于 2024-5-22 21:47 编辑


  1.     axios.interceptors.response.use(function (response) {
  2.       return response;
  3.     }, function (error) {

  4.        error = JSON.parse(JSON.stringify(error))
  5.       if(error.status===401){
  6.         goPage("login_pwd",{},{},true);
  7.         return Promise.reject(error);
  8.       }
  9.       
  10.     });
复制代码

我在请求拦截的时候,判断状态码401的话 让他跳转到登录页,但是好像是因为return Promise.reject(error),页面就卡死了,停在主页上打转还报错
微信图片_20240522214737.jpg


664df6ebdf4d8.png
13
帖子
0
勋章
139
Y币
  1. /*
  2. *  整理ajax 统一入口,方便修改
  3. *
  4. * */
  5. import axios from 'axios'
  6. import { globalData ,memory, storage,goPage} from "./utils";

  7. // const baseUrl = process.env.NODE_ENV === 'development' ? 'http://39.99.172.42/api/home' : ''
  8. const baseUrl = 'https://dingdongapi**.**/api'
  9. const returnAll = false

  10. function fetch({ url, data, method = "get", report = false }) {
  11.   console.log('ajax url', url, JSON.stringify(data))
  12.   let user_id = storage.get('user_id')
  13.   console.log('ajax user_id', user_id)
  14.   let headers = {}
  15.   // 写入headers
  16.   if (user_id) {
  17.     headers['user_id'] = user_id,
  18.     headers['Authorization'] = storage.get('token')
  19.     headers['Content-Type'] = "application/json"
  20.   }
  21.   // let arr = memory.get('token').split('.')
  22.   // console.warn(user_id);
  23.   // console.warn(atob(arr[0].split(' ')[1]));
  24.   // console.warn(JSON.parse(atob(arr[1])));

  25.     axios.interceptors.response.use(function (response) {
  26.       return response;
  27.     }, function (error) {


  28.        error = JSON.parse(JSON.stringify(error))
  29.       if(error.status===401){
  30.         goPage("login_pwd");
  31.       }
  32.       return Promise.reject(error);
  33.     });


  34.   return new Promise((resolve, reject) => {
  35.     try {
  36.       let u = url.startsWith('/') ? `${baseUrl}${url}` : url
  37.       // 手机环境是有apicloud的ajax
  38.       if (method !== 'upload') {
  39.         api.ajax({
  40.           url: u,
  41.           method,
  42.           headers: {
  43.             ...headers,
  44.             "Content-Type": "application/json"
  45.           },
  46.           data: {
  47.             body: data
  48.           },
  49.           report,
  50.           returnAll
  51.         }, (ret, err) => {
  52.           if (err) {
  53.             reject(err);
  54.           }
  55.           console.log('ajax result', JSON.stringify(ret))
  56.           resolve(returnAll ? ret.body : ret);
  57.         });
  58.       } else {
  59.         let files = data.files
  60.         delete data.files
  61.         api.ajax({
  62.           url: u,
  63.           method: 'post',
  64.           headers: {
  65.             ...headers,
  66.           },
  67.           data: {
  68.             values: data,
  69.             files
  70.           },
  71.           report,
  72.           returnAll
  73.         }, (ret, err) => {
  74.           if (err) {
  75.             reject(err);
  76.           }
  77.           console.log('ajax upload result', JSON.stringify(ret))
  78.           resolve(returnAll ? ret.body : ret);
  79.         });
  80.       }
  81.     } catch (e) {
  82.       // 本地环境没有api的情况下使用axios 本地测试可用
  83.       if (method === 'upload') {
  84.         headers['Content-Type'] = 'application/x-www-form-urlencoded'
  85.       }
  86.       axios({
  87.         url: url.startsWith('/') ? `/api${url}` : url,
  88.         method: method === 'upload' ? 'post' : method,
  89.         data,
  90.         headers
  91.       }).then((res,err) => {

  92.         let { data } = res
  93.         resolve(data)
  94.       })
  95.     }
  96.   });
  97. }

  98. const ajax = {
  99.   get(url) {
  100.     let u = url
  101.     if (!url.includes('ocr**.**-hangzhou.aliyuncs.com')) {
  102.       u = url .includes('?') ? `${url}&r=${+new Date()}` : `${url}?r=${+new Date()}`
  103.     }
  104.     return fetch({ url: u })
  105.   },
  106.   post(url, data) {
  107.     return fetch({ url, method: 'post', data })
  108.   },
  109.   upload(url, data) {
  110.     return fetch({ url, method: 'upload', data })
  111.   }
  112. }

  113. export default ajax
复制代码

大家帮我看下,每次登录状态过期的时候,返回401状态码,然后页面就卡死到这里了,错误提示再上图
13
帖子
0
勋章
139
Y币
本帖最后由 BIP538741 于 2024-5-22 23:51 编辑

对应的浏览器上的错误。然后每次401的时候app上都会报Uncaught (in promise) #<Object> at root.js:1
微信图片_20240522234906.png
0
帖子
2
勋章
1573
Y币
看你的页面,完全使用web方式去写app的项目代码,官方是不推荐的,官方有专门提供的api.ajax进行网络请求。

看你的报错信息,应该是手机不支持promise写法导致的,建议你用原生写法,或者自己通过工程化的方式去编译兼容版本的代码。

移动端的手机设备,因为厂家不同、型号版本不同,所以对于ES6及以上的语法存在兼容性问题,部分手机不支持。

不过这里需要提前说明,因为工程化本身就很复杂,所以对于使用工程化框架后项目出现的问题,官方技术不予支持。
您需要登录后才可以回帖 登录

本版积分规则