request.js 2.1 KB

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