useConditionEventManager.js 2.4 KB

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