-
Notifications
You must be signed in to change notification settings - Fork 389
Expand file tree
/
Copy patheffectScope.js
More file actions
109 lines (97 loc) · 2.36 KB
/
effectScope.js
File metadata and controls
109 lines (97 loc) · 2.36 KB
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
let activeEffectScope
class EffectScope {
active = true
effects = []
cleanups = []
constructor (detached) {
if (!detached && activeEffectScope) {
this.parent = activeEffectScope
this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(this) - 1
}
}
run (fn) {
if (this.active) {
const currentEffectScope = activeEffectScope
try {
activeEffectScope = this
return fn()
} finally {
activeEffectScope = currentEffectScope
}
}
}
on () {
activeEffectScope = this
}
off () {
activeEffectScope = this.parent
}
stop (fromParent) {
if (this.active) {
let i, l
for (i = 0, l = this.effects.length; i < l; i++) {
this.effects[i].stop()
}
for (i = 0, l = this.cleanups.length; i < l; i++) {
this.cleanups[i]()
}
if (this.scopes) {
for (i = 0, l = this.scopes.length; i < l; i++) {
this.scopes[i].stop(true)
}
}
// nested scope, dereference from parent to avoid memory leaks
if (this.parent && !fromParent) {
// optimized O(1) removal
const last = this.parent.scopes.pop()
if (last && last !== this) {
this.parent.scopes[this.index] = last
last.index = this.index
}
}
this.active = false
}
}
pause () {
if (this.active) {
let i, l
for (i = 0, l = this.effects.length; i < l; i++) {
this.effects[i].pause()
}
if (this.scopes) {
for (i = 0, l = this.scopes.length; i < l; i++) {
this.scopes[i].pause()
}
}
}
}
resume (ignoreDirty = false) {
if (this.active) {
let i, l
for (i = 0, l = this.effects.length; i < l; i++) {
this.effects[i].resume(ignoreDirty)
}
if (this.scopes) {
for (i = 0, l = this.scopes.length; i < l; i++) {
this.scopes[i].resume(ignoreDirty)
}
}
}
}
}
export function effectScope (detached) {
return new EffectScope(detached)
}
export function recordEffectScope (effect, scope = activeEffectScope) {
if (scope && scope.active) {
scope.effects.push(effect)
}
}
export function getCurrentScope () {
return activeEffectScope
}
export function onScopeDispose (fn) {
if (activeEffectScope) {
activeEffectScope.cleanups.push(fn)
}
}