request.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import {
  2. requestConfig
  3. } from '@/app.config.js'
  4. let isRefreshing = true // 是否正在刷新的标记
  5. let subscribers = []; // 缓存
  6. function onAccessTokenFetched() {
  7. // 更新个人中心的数据
  8. uni.$emit("userinfoRefresh", true)
  9. subscribers.forEach((callback) => {
  10. callback()
  11. })
  12. subscribers = [];
  13. }
  14. function addSubscriber(callback) {
  15. subscribers.push(callback)
  16. }
  17. function checkStatus(param) {
  18. // 刷新token的函数,这需要添加一个开关,防止重复请求
  19. if (isRefreshing) {
  20. referToken()
  21. }
  22. isRefreshing = false;
  23. // 将token刷新成功后的回调请求缓存
  24. const retryOriginalRequest = new Promise((resolve) => {
  25. addSubscriber(() => {
  26. resolve(Request.prototype.http(param))
  27. })
  28. });
  29. return retryOriginalRequest;
  30. }
  31. // 无感刷新
  32. function referToken() {
  33. uni.removeStorageSync('token');
  34. api.login({
  35. grant_type: 'refresh',
  36. refresh_token: uni.getStorageSync('refresh_token'),
  37. client_type: 0,
  38. }).then(res => {
  39. if (res.code === 200) {
  40. uni.removeStorageSync('refresh_token');
  41. uni.setStorageSync("token", 'Bearer ' + res.data
  42. .access_token);
  43. uni.setStorageSync("refresh_token", res.data
  44. .refresh_token);
  45. //执行缓存中的请求
  46. onAccessTokenFetched()
  47. //延迟几秒再将刷新token的开关放开,不然偶尔还是会重复提交刷新token的请求
  48. setTimeout(() => {
  49. isRefreshing = true;
  50. }, 3000)
  51. }
  52. })
  53. }
  54. class Request {
  55. http(param) {
  56. let url = param.url,
  57. header = param.header,
  58. method = param.method,
  59. data = param.data,
  60. dataType = 'json',
  61. responseType = param.responseType || 'text'
  62. if (header) {
  63. header = param.header
  64. } else {
  65. header = {
  66. 'Content-type': "application/x-www-form-urlencoded",
  67. };
  68. }
  69. const token = uni.getStorageSync('token');
  70. header['token'] = header['token'] ? header['token'] : token ? token : '';
  71. // 返回promise
  72. return new Promise((resolve, reject) => {
  73. let baseUrl
  74. if (process.env.NODE_ENV === 'production') {
  75. baseUrl = requestConfig.prodBaseUrl
  76. } else {
  77. baseUrl = requestConfig.test ? requestConfig.testBaseUrl : requestConfig.devBaseUrl
  78. }
  79. // 请求
  80. uni.request({
  81. url: baseUrl + url,
  82. data: data,
  83. method: method,
  84. dataType: dataType,
  85. responseType: responseType,
  86. header: header,
  87. success: (res) => {
  88. if (res.statusCode && res.statusCode != 200) {
  89. uni.$u.toast("api错误" + res.data.error)
  90. return;
  91. }
  92. if (res.data.code !== 200) {
  93. // code判断:200成功,不等于200错误
  94. if (res.data.code == 501) {
  95. if (!uni.getStorageSync('refresh_token')) {
  96. webUni.webViewuni.reLaunch({
  97. url: "/pages/index/login/login",
  98. });
  99. }
  100. // 登录信息失效,静默登录
  101. checkStatus(param).then(res => {
  102. resolve(res)
  103. })
  104. } else {
  105. uni.$u.toast(res.data.msg)
  106. }
  107. }
  108. // 将结果抛出
  109. resolve(res.data)
  110. },
  111. //请求失败
  112. fail: (e) => {
  113. uni.$u.toast('网络异常, 请检查网络连接')
  114. resolve(e.data);
  115. },
  116. //请求完成
  117. complete() {
  118. resolve();
  119. return;
  120. },
  121. })
  122. })
  123. }
  124. }
  125. export default new Request()