useConditionEventManager.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import _ from "lodash";
  2. import {createEventHook} from "@vueuse/shared";
  3. import {empty} from "@/uni_modules/uv-ui-tools/libs/function/test";
  4. export const useConditionEventManager = function (queryParams, validator, console) {
  5. // 工作列表,工作列表清空时,表示条件已经准备好了
  6. const workingList = ref([])
  7. // 初次完成标识
  8. const initialized = ref(false)
  9. // 外抛事件,一般事件
  10. const searchEvent = createEventHook()
  11. // 初始化成功时的外抛事件,会优先于searchEvent外抛
  12. const initEvent = createEventHook()
  13. const push = function (reason, ...keys) {
  14. workingList.value.push(...keys)
  15. console.log('eventManager push reason:', reason, ', key:', keys + '', ', result:', workingList.value + '')
  16. }
  17. const pop = async (reason, key) => {
  18. if (workingList.value.includes(key)) {
  19. _.pull(workingList.value, key)
  20. console.log('eventManager pop reason:', reason, ', key:', key, ', result:', workingList.value + '')
  21. await trigger('working list check')
  22. }
  23. }
  24. // loadData 引发的pop 与 dataManager 非被依赖项watch 有时会并发触发trigger
  25. // 用triggerLock来控制并发只执行一次,TODO:待观察看有没有更好的方式
  26. let triggerLock = false
  27. const trigger = async (reason) => {
  28. if (triggerLock) {
  29. console.log('eventManager trigger ignore by lock,reason', reason)
  30. return
  31. }
  32. triggerLock = true
  33. console.log('eventManager trigger reason:', reason)
  34. try {
  35. // check trigger event
  36. if (empty(workingList.value) && !empty(queryParams.value)) {
  37. // 看当前是否数据有效
  38. await validator.value()
  39. if (!initialized.value) {
  40. console.log('eventManager init trigger')
  41. await initEvent.trigger()
  42. initialized.value = true
  43. }
  44. console.log('eventManager search trigger', new Date().getTime())
  45. await searchEvent.trigger()
  46. }
  47. } finally {
  48. triggerLock = false
  49. }
  50. }
  51. const reset = function () {
  52. workingList.value.length = 0
  53. }
  54. return {
  55. push,
  56. pop,
  57. trigger,
  58. reset,
  59. onSearch: searchEvent.on,
  60. onInit: initEvent.on
  61. }
  62. }