-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreducs.js
50 lines (41 loc) · 1.17 KB
/
reducs.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
const state = {}
let beforeCallbacks = []
let afterCallbacks = []
let globalId = 0
const deleteId = (id, type) => {
type === 'a'
? afterCallbacks = afterCallbacks.filter(e => e.id !== id)
: beforeCallbacks = beforeCallbacks.filter(e => e.id !== id)
}
export const register = (fn, type = 'a') => {
const id = globalId++
(type === 'a' ? afterCallbacks : beforeCallbacks).push({ fn, id })
return () => deleteId(id, type)
}
export const setState = async (key, value) => {
for (const e of [...beforeCallbacks, { fn: () => { state[key] = value } }, ...afterCallbacks]) {
const v = e.fn(key, value)
if (v instanceof Promise) await v
}
}
export const stateEmpty = () => !Object.keys(state).length
export const getState = (key) => state[key]
/*
// debugger
setState('state', 1)
const f1 = () => console.log('f1')
const f2 = () => console.log('f2')
const f3 = () => console.log('f3')
const removeF11 = register(f1)
const removeF12 = register(f1)
const removeF2 = register(f2)
const removeF3 = register(f3, 'b')
setState('state', 2)
console.log('-------')
removeF2()
setState('state', 3)
console.log('-------')
removeF3()
setState('state', 4)
console.log('-------')
*/