-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathTimerEnhance.js
More file actions
101 lines (83 loc) · 3.32 KB
/
TimerEnhance.js
File metadata and controls
101 lines (83 loc) · 3.32 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
/*
* A TimerEnhance for React Native app (es6) which replaced TimerMixin (es5)
* provides timer functions for executing code in the future that are safely cleaned up when the component unmounts
* https://github.com/react-native-component/react-native-smart-timer-enhance/
* Released under the MIT license
* Copyright (c) 2016 react-native-component <moonsunfall@aliyun.com>
*/
export default TimerEnhance = (ComposedComponent) => {
let setter = (_setter, _clearer, _key) => {
return function (callback, interval) {
let timerId = _setter((...params) => {
_clearer.call(this, timerId)
callback.apply(this, params)
}, interval)
let { [_key]: timers } = this
if (!timers) {
this[ _key ] = [ timerId ]
} else {
timers.push(timerId)
}
return timerId
}
}
let clearer = (_clearer, _key) => {
return function (timerId) {
let { [_key]: timers } = this
if (timers) {
let index = timers.indexOf(timerId)
if (~index) {
timers.splice(index, 1)
}
}
_clearer(timerId)
}
}
let _timeouts = 'TimerEnhance_timeouts'
let _clearTimeout = clearer(clearTimeout, _timeouts)
let _setTimeout = setter(setTimeout, _clearTimeout, _timeouts)
let _intervals = 'TimerEnhance_intervals'
let _clearInterval = clearer(clearInterval, _intervals)
let _setInterval = setter(setInterval, () => {}, _intervals)
let _immediates = 'TimerEnhance_immediates'
let _clearImmediate = clearer(clearImmediate, _immediates)
let _setImmediate = setter(setImmediate, _clearImmediate, _immediates)
let _animationFrames = 'TimerEnhance_animationFrames'
let _cancelAnimationFrame = clearer(cancelAnimationFrame, _animationFrames)
let _requestAnimationFrame = setter(requestAnimationFrame, _cancelAnimationFrame, _animationFrames)
return class extends ComposedComponent {
componentWillUnmount () {
super.componentWillUnmount && super.componentWillUnmount()
let {
[_timeouts]: timeouts,
[_intervals]: intervals,
[_immediates]: immediates,
[_animationFrames]: animationFrames,
} = this
timeouts && timeouts.forEach((timerId) => {
clearTimeout(timerId)
})
this[ _timeouts ] = null
intervals && intervals.forEach((timerId) => {
clearInterval(timerId)
})
this[ _intervals ] = null
immediates && immediates.forEach((timerId) => {
clearImmediate(timerId)
})
this[ _immediates ] = null
animationFrames && animationFrames.forEach((timerId) => {
cancelAnimationFrame(timerId)
})
this[ _animationFrames ] = null
}
setTimeout = _setTimeout
clearTimeout = _clearTimeout
setInterval = _setInterval
clearInterval = _clearInterval
setImmediate = _setImmediate
clearImmediate = _clearImmediate
requestAnimationFrame = _requestAnimationFrame
cancelAnimationFrame = _cancelAnimationFrame
}
}