init (graduate from prototype)
This commit is contained in:
40
packages/scheduler/src/index.ts
Normal file
40
packages/scheduler/src/index.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
const queue: Array<() => void> = []
|
||||
const postFlushCbs: Array<() => void> = []
|
||||
const p = Promise.resolve()
|
||||
let flushing = false
|
||||
|
||||
export function nextTick(fn: () => void) {
|
||||
p.then(fn)
|
||||
}
|
||||
|
||||
export function queueJob(job: () => void, postFlushCb?: () => void) {
|
||||
if (queue.indexOf(job) === -1) {
|
||||
if (flushing) {
|
||||
job()
|
||||
} else {
|
||||
queue.push(job)
|
||||
}
|
||||
}
|
||||
if (postFlushCb) {
|
||||
queuePostFlushCb(postFlushCb)
|
||||
}
|
||||
if (!flushing) {
|
||||
nextTick(flushJobs)
|
||||
}
|
||||
}
|
||||
|
||||
export function queuePostFlushCb(cb: () => void) {
|
||||
postFlushCbs.push(cb)
|
||||
}
|
||||
|
||||
export function flushJobs() {
|
||||
flushing = true
|
||||
let job
|
||||
while ((job = queue.shift())) {
|
||||
job()
|
||||
}
|
||||
while ((job = postFlushCbs.shift())) {
|
||||
job()
|
||||
}
|
||||
flushing = false
|
||||
}
|
||||
Reference in New Issue
Block a user