request.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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().$vm.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().$vm.exit();
  40. return;
  41. }
  42. let newInfo = res.data.data;
  43. uni.setStorageSync("loginInfo", newInfo);
  44. requestList.forEach(cb => cb());
  45. requestList = [];
  46. isRefreshToken = false;
  47. // 重新发送刚才的请求
  48. return resolve(request(options))
  49. } else {
  50. uni.showToast({
  51. icon: "none",
  52. title: res.data.message,
  53. duration: 1500
  54. })
  55. return reject(res.data)
  56. }
  57. },
  58. fail(error) {
  59. uni.showToast({
  60. title: "网络似乎有点不给力哟",
  61. icon: "none",
  62. duration: 1500
  63. })
  64. return reject(error)
  65. }
  66. });
  67. });
  68. }
  69. const reqRefreshToken = (loginInfo) => {
  70. return new Promise(function (resolve, reject) {
  71. uni.request({
  72. method: 'PUT',
  73. url: UNI_APP.BASE_URL + '/refreshToken',
  74. header: {
  75. refreshToken: loginInfo.refreshToken
  76. },
  77. success: (res) => {
  78. resolve(res);
  79. },
  80. fail: (res) => {
  81. reject(res);
  82. }
  83. });
  84. });
  85. }
  86. export default request;