request.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // 请求队列
  2. let requestList = [];
  3. // 是否正在刷新中
  4. let isRefreshToken = false;
  5. const request = (options) => {
  6. const header = options.header || {};
  7. const loginInfo = uni.getStorageSync("loginInfo");
  8. if (loginInfo) {
  9. header.accessToken = loginInfo.accessToken;
  10. }
  11. return new Promise(function(resolve, reject) {
  12. uni.request({
  13. url: process.env.BASE_URL + options.url,
  14. method: options.method || 'GET',
  15. header: header,
  16. data: options.data || {},
  17. async success(res) {
  18. if (res.data.code == 200) {
  19. return resolve(res.data.data)
  20. } else if (res.data.code == 400) {
  21. navToLogin();
  22. } else if (res.data.code == 401) {
  23. console.log("token失效,尝试重新获取")
  24. if (isRefreshToken) {
  25. // 正在刷新token,把其他请求存起来
  26. requestList.push(() => {
  27. resolve(request(options))
  28. })
  29. return;
  30. }
  31. isRefreshToken = true;
  32. // 发送请求, 进行刷新token操作, 获取新的token
  33. const res = await reqRefreshToken(loginInfo);
  34. if (!res || res.data.code != 200) {
  35. requestList = [];
  36. isRefreshToken = false;
  37. console.log("刷新token失败")
  38. navToLogin();
  39. return;
  40. }
  41. uni.setStorageSync("loginInfo", res.data.data);
  42. requestList.forEach(cb => cb());
  43. requestList = [];
  44. isRefreshToken = false;
  45. // 保存token
  46. console.log(res.data.data.accessToken)
  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. duration: 1500
  62. })
  63. return reject(error)
  64. }
  65. });
  66. });
  67. }
  68. const reqRefreshToken = (loginInfo) => {
  69. return new Promise(function(resolve, reject) {
  70. uni.request({
  71. method: 'PUT',
  72. url: process.env.BASE_URL + '/refreshToken',
  73. header: {
  74. refreshToken: loginInfo.refreshToken
  75. },
  76. success: (res) => {
  77. resolve(res);
  78. },
  79. fail: (res) => {
  80. reject(res);
  81. }
  82. });
  83. });
  84. }
  85. const navToLogin = () => {
  86. uni.showToast({
  87. icon: "none",
  88. title: "登录过期,请需要重新登录",
  89. duration: 1500
  90. })
  91. getApp().exit();
  92. }
  93. export default request;