request.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import UNI_APP from '@/.env.js'
  2. // 请求队列
  3. let requestList = [];
  4. // 是否正在刷新中
  5. let isRefreshToken = false;
  6. const request = (options) => {
  7. const header = options.header || {};
  8. const loginInfo = uni.getStorageSync("loginInfo");
  9. if (loginInfo) {
  10. header.accessToken = loginInfo.accessToken;
  11. }
  12. return new Promise(function (resolve, reject) {
  13. uni.request({
  14. url: UNI_APP.BASE_URL + options.url,
  15. method: options.method || 'GET',
  16. header: header,
  17. data: options.data || {},
  18. timeout: options.timeout || 3000,
  19. async success(res) {
  20. if (res.data.code == 200) {
  21. return resolve(res.data.data)
  22. } else if (res.data.code == 400) {
  23. getApp().$vm.exit();
  24. } else if (res.data.code == 401) {
  25. console.log("token失效,尝试重新获取")
  26. if (isRefreshToken) {
  27. // 正在刷新token,把其他请求存起来
  28. requestList.push(() => {
  29. resolve(request(options))
  30. })
  31. return;
  32. }
  33. isRefreshToken = true;
  34. // 发送请求, 进行刷新token操作, 获取新的token
  35. const res = await reqRefreshToken(loginInfo);
  36. if (!res || res.data.code != 200) {
  37. requestList = [];
  38. isRefreshToken = false;
  39. console.log("刷新token失败")
  40. getApp().$vm.exit();
  41. return;
  42. }
  43. let newInfo = res.data.data;
  44. uni.setStorageSync("loginInfo", newInfo);
  45. requestList.forEach(cb => cb());
  46. requestList = [];
  47. isRefreshToken = false;
  48. // 重新发送刚才的请求
  49. return resolve(request(options))
  50. } else {
  51. uni.showToast({
  52. icon: "none",
  53. title: res.data.message,
  54. duration: 1500
  55. })
  56. return reject(res.data)
  57. }
  58. },
  59. fail(error) {
  60. uni.showToast({
  61. title: "网络似乎有点不给力哟",
  62. icon: "none",
  63. duration: 1500
  64. })
  65. return reject(error)
  66. }
  67. });
  68. });
  69. }
  70. const reqRefreshToken = (loginInfo) => {
  71. return new Promise(function (resolve, reject) {
  72. uni.request({
  73. method: 'PUT',
  74. url: UNI_APP.BASE_URL + '/refreshToken',
  75. header: {
  76. refreshToken: loginInfo.refreshToken
  77. },
  78. success: (res) => {
  79. resolve(res);
  80. },
  81. fail: (res) => {
  82. reject(res);
  83. }
  84. });
  85. });
  86. }
  87. export default request;