remote.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. const cache = new Map()
  2. const cacheTime = new Map()
  3. /**
  4. * 远程获取[避免重复请求]
  5. * @param prefix 前缀
  6. * @param params 参数配置
  7. * @param remoteFunc 反馈参数
  8. * @param repeatRequest 是否重复请求
  9. * @returns {Promise<any>|Promise<T | never>}
  10. */
  11. export function remoteRequest(prefix, params, remoteFunc, repeatRequest = true, requestTime = 2000) {
  12. if (params == null) {
  13. return new Promise((resolve) => {
  14. resolve([])
  15. })
  16. }
  17. const timeKey = prefix + '#' + JSON.stringify(params)
  18. let time = ''
  19. if (repeatRequest) {
  20. const curTime = new Date().getTime()
  21. time = cacheTime.get(timeKey)
  22. if (time == null) {
  23. cacheTime.set(timeKey, curTime)
  24. time = curTime
  25. }
  26. if (curTime - requestTime >= time) { // 2秒内的请求都重新请求
  27. // 清除缓存换个请求
  28. cacheTime.clear()
  29. cacheTime.set(timeKey, curTime)
  30. time = curTime
  31. }
  32. }
  33. const key = timeKey + '#' + time
  34. // 远程获取
  35. let item = cache.get(key)
  36. if (item == null || item.error === true) {
  37. // 还没加载过
  38. if (item == null) {
  39. item = { loading: true, callbacks: [] }
  40. cache.set(key, item)
  41. }
  42. item.loading = true
  43. item.error = false
  44. // 远程加载
  45. return remoteFunc().then((data) => {
  46. // prop mapping
  47. item.data = data
  48. // 之前注册过的callback全部触发
  49. for (const callback of item.callbacks) {
  50. callback(item.data)
  51. }
  52. item.loading = false
  53. item.callbacks = []
  54. return data
  55. }).catch(() => {
  56. item.loading = false
  57. item.error = true
  58. })
  59. } else if (item.loading === true) {
  60. // 正在加载中,注册callback,等加载完了之后,再统一触发,就只需要向服务器请求一次数据模版
  61. return new Promise((resolve) => {
  62. const callback = (data) => {
  63. resolve(data)
  64. }
  65. item.callbacks.push(callback)
  66. })
  67. } else {
  68. // 从缓存拿
  69. return new Promise((resolve) => {
  70. resolve(item.data)
  71. })
  72. }
  73. }
  74. const cacheTrans = new Map()
  75. const cacheTransTime = new Map()
  76. /**
  77. * 远程获取数据合并同一请求 [避免重复请求]
  78. * @param prefix 前缀
  79. * @param id 参数配置
  80. * @returns {Promise<any>|Promise<T | never>}
  81. */
  82. export function remoteTransRequest(prefix, id) {
  83. const curTime = new Date().getTime()
  84. const timeOut = 200
  85. let time = cacheTransTime.get(prefix)
  86. if (time == null) {
  87. cacheTransTime.set(prefix, curTime)
  88. time = curTime
  89. }
  90. if (curTime - timeOut >= time) { // 2秒内的请求都重新请求
  91. // 清除缓存换个请求
  92. cacheTransTime.clear()
  93. cacheTransTime.set(prefix, curTime)
  94. time = curTime
  95. }
  96. const key = prefix + '#' + time
  97. // 汇总接口
  98. let item = cacheTrans.get(key)
  99. let idVal = id
  100. if (Object.prototype.toString.call(id) === '[object Object]') {
  101. idVal = JSON.stringify(id)
  102. }
  103. if (item == null || item.error === true) {
  104. // 还没加载过
  105. if (item == null) {
  106. item = { loading: true, ids: new Set(), callbacks: [] }
  107. cacheTrans.set(key, item)
  108. }
  109. item.loading = true
  110. item.ids = item.ids.add(idVal)
  111. const remoteFunc = (ids) => {
  112. return new Promise((resolve) => {
  113. setTimeout(() => {
  114. resolve(ids)
  115. }, 100)
  116. })
  117. }
  118. return remoteFunc(item.ids).then((ids) => {
  119. item.ids = ids
  120. // 之前注册过的callback全部触发
  121. for (const callback of item.callbacks) {
  122. callback(ids)
  123. }
  124. item.loading = false
  125. item.callbacks = []
  126. return ids
  127. })
  128. } else if (item.loading === true) {
  129. // 正在加载中,注册callback,等加载完了之后,再统一触发,就只需要向服务器请求一次数据模版
  130. return new Promise((resolve) => {
  131. const callback = (ids) => {
  132. item.ids = ids.add(idVal)
  133. resolve(item.ids)
  134. }
  135. item.callbacks.push(callback)
  136. })
  137. } else {
  138. // 从缓存拿
  139. return new Promise((resolve) => {
  140. resolve(item.ids)
  141. })
  142. }
  143. }