From 4f9e6b5264add838b279271051a4071bfdf14e54 Mon Sep 17 00:00:00 2001 From: cuixiaorui Date: Wed, 27 Jul 2022 22:02:33 +0800 Subject: [PATCH] feat: support pre flush job --- packages/runtime-core/src/scheduler.ts | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/runtime-core/src/scheduler.ts b/packages/runtime-core/src/scheduler.ts index 9d2540a..1abaa10 100644 --- a/packages/runtime-core/src/scheduler.ts +++ b/packages/runtime-core/src/scheduler.ts @@ -1,4 +1,5 @@ const queue: any[] = []; +const activePreFlushCbs:any = []; const p = Promise.resolve(); let isFlushPending = false; @@ -27,8 +28,27 @@ function queueFlush() { nextTick(flushJobs); } +export function queuePreFlushCb(cb) { + queueCb(cb, activePreFlushCbs); +} + +function queueCb(cb, activeQueue) { + // 直接添加到对应的列表内就ok + // todo 这里没有考虑 activeQueue 是否已经存在 cb 的情况 + // 然后在执行 flushJobs 的时候就可以调用 activeQueue 了 + activeQueue.push(cb); +} + function flushJobs() { isFlushPending = false; + + // 先执行 pre 类型的 job + // 所以这里执行的job 是在渲染前的 + // 也就意味着执行这里的 job 的时候 页面还没有渲染 + flushPreFlushCbs(); + + // 这里是执行 queueJob 的 + // 比如 render 渲染就是属于这个类型的 job let job; while ((job = queue.shift())) { if (job) { @@ -36,3 +56,10 @@ function flushJobs() { } } } + +function flushPreFlushCbs() { + // 执行所有的 pre 类型的 job + for (let i = 0; i < activePreFlushCbs.length; i++) { + activePreFlushCbs[i]() + } +}