request.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. async success(res) {
  19. if (res.data.code == 200) {
  20. return resolve(res.data.data)
  21. } else if (res.data.code == 400) {
  22. getApp().exit();
  23. } else if (res.data.code == 401) {
  24. console.log("token失效,尝试重新获取")
  25. if (isRefreshToken) {
  26. // 正在刷新token,把其他请求存起来
  27. requestList.push(() => {
  28. resolve(request(options))
  29. })
  30. return;
  31. }
  32. isRefreshToken = true;
  33. // 发送请求, 进行刷新token操作, 获取新的token
  34. const res = await reqRefreshToken(loginInfo);
  35. if (!res || res.data.code != 200) {
  36. requestList = [];
  37. isRefreshToken = false;
  38. console.log("刷新token失败")
  39. getApp().exit();
  40. return;
  41. }
  42. uni.setStorageSync("loginInfo", res.data.data);
  43. requestList.forEach(cb => cb());
  44. requestList = [];
  45. isRefreshToken = false;
  46. // 重新发送刚才的请求
  47. return resolve(request(options))
  48. } else {
  49. uni.showToast({
  50. icon: "none",
  51. title: res.data.message,
  52. duration: 1500
  53. })
  54. return reject(res.data)
  55. }
  56. },
  57. fail(error) {
  58. uni.showToast({
  59. title: "网络似乎有点不给力,请稍后重试",
  60. duration: 1500
  61. })
  62. return reject(error)
  63. }
  64. });
  65. });
  66. }
  67. const reqRefreshToken = (loginInfo) => {
  68. return new Promise(function(resolve, reject) {
  69. uni.request({
  70. method: 'PUT',
  71. url: UNI_APP.BASE_URL + '/refreshToken',
  72. header: {
  73. refreshToken: loginInfo.refreshToken
  74. },
  75. success: (res) => {
  76. resolve(res);
  77. },
  78. fail: (res) => {
  79. reject(res);
  80. }
  81. });
  82. });
  83. }
  84. export default request;