123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- import {ref, watch} from 'vue'
- import {createEventHook} from "@vueuse/core";
- import _ from "lodash";
- import {empty} from "@/uni_modules/uv-ui-tools/libs/function/test";
- export const useConditionEventManager = function (queryParams, validator, console) {
- // 工作列表,工作列表清空时,表示条件已经准备好了
- const workingList = ref([])
- // 初次完成标识
- const initialized = ref(false)
- // 外抛事件,一般事件
- const searchEvent = createEventHook()
- // 初始化成功时的外抛事件,会优先于searchEvent外抛
- const initEvent = createEventHook()
- const push = function (reason, ...keys) {
- workingList.value.push(...keys)
- console.log('eventManager push reason:', reason, ', key:', keys + '', ', result:', workingList.value + '')
- }
- const pop = async (reason, key) => {
- if (workingList.value.includes(key)) {
- _.pull(workingList.value, key)
- console.log('eventManager pop reason:', reason, ', key:', key, ', result:', workingList.value + '')
- await trigger('working list check')
- }
- }
- // loadData 引发的pop 与 dataManager 非被依赖项watch 有时会并发触发trigger
- // 用triggerLock来控制并发只执行一次,TODO:待观察看有没有更好的方式
- let triggerLock = false
- const trigger = async (reason) => {
- if (triggerLock) {
- console.log('eventManager trigger ignore by lock,reason', reason)
- return
- }
- triggerLock = true
- console.log('eventManager trigger reason:', reason)
- try {
- // check trigger event
- if (empty(workingList.value) && !empty(queryParams.value)) {
- // 看当前是否数据有效
- await validator.value()
- if (!initialized.value) {
- console.log('eventManager init trigger')
- await initEvent.trigger()
- initialized.value = true
- }
- console.log('eventManager search trigger', new Date().getTime())
- await searchEvent.trigger()
- }
- } finally {
- triggerLock = false
- }
- }
- const reset = function () {
- workingList.value.length = 0
- }
- return {
- push,
- pop,
- trigger,
- reset,
- onSearch: searchEvent.on,
- onInit: initEvent.on
- }
- }
|