1
1
var _ = require ( './util' )
2
2
3
+ // we have two separate queues: one for directive updates
4
+ // and one for user watcher registered via $watch().
5
+ // we want to guarantee directive updates to be called
6
+ // before user watchers so that when user watchers are
7
+ // triggered, the DOM would have already been in updated
8
+ // state.
9
+ var queue = [ ]
10
+ var userQueue = [ ]
11
+ var has = { }
12
+ var waiting = false
13
+ var flushing = false
14
+
3
15
/**
4
- * The Batcher maintains a job queue to be run
5
- * async on the next event loop. A "job" can be any object
6
- * that implements the following interface:
7
- *
8
- * {
9
- * id: {Number} - optional
10
- * run: {Function}
11
- * user: {Boolean} - optional
12
- * }
13
- *
14
- * The `id` property is used to prevent duplication of jobs,
15
- * while jobs with `user:true` need to be processed after
16
- * all internal jobs have been processed first.
17
- *
18
- * In most cases a job will actually be a Watcher instance
19
- * which implements the above interface.
16
+ * Reset the batcher's state.
20
17
*/
21
18
22
- function Batcher ( ) {
23
- this . reset ( )
19
+ function reset ( ) {
20
+ queue = [ ]
21
+ userQueue = [ ]
22
+ has = { }
23
+ waiting = false
24
+ flushing = false
24
25
}
25
26
26
- var p = Batcher . prototype
27
+ /**
28
+ * Flush both queues and run the jobs.
29
+ */
30
+
31
+ function flush ( ) {
32
+ flushing = true
33
+ run ( queue )
34
+ run ( userQueue )
35
+ reset ( )
36
+ }
27
37
28
38
/**
29
- * Reset the batcher's state.
39
+ * Run the jobs in a single queue.
40
+ *
41
+ * @param {Array } queue
30
42
*/
31
43
32
- p . reset = function ( ) {
33
- this . has = { }
34
- // we have two separate queues: one for directive updates
35
- // and one for user watcher registered via $watch().
36
- // we want to guarantee directive updates to be called
37
- // before user watchers so that when user watchers are
38
- // triggered, the DOM would have already been in updated
39
- // state.
40
- this . queue = [ ]
41
- this . userQueue = [ ]
42
- this . waiting = false
43
- this . flushing = false
44
+ function run ( queue ) {
45
+ // do not cache length because more jobs might be pushed
46
+ // as we run existing jobs
47
+ for ( var i = 0 ; i < queue . length ; i ++ ) {
48
+ queue [ i ] . run ( )
49
+ }
44
50
}
45
51
46
52
/**
@@ -54,51 +60,21 @@ p.reset = function () {
54
60
* - {Function} run
55
61
*/
56
62
57
- p . push = function ( job ) {
58
- if ( ! job . id || ! this . has [ job . id ] || this . flushing ) {
63
+ exports . push = function ( job ) {
64
+ if ( ! job . id || ! has [ job . id ] || flushing ) {
59
65
// A user watcher callback could trigger another
60
66
// directive update during the flushing; at that time
61
67
// the directive queue would already have been run, so
62
68
// we call that update immediately as it is pushed.
63
- if ( this . flushing && ! job . user ) {
69
+ if ( flushing && ! job . user ) {
64
70
job . run ( )
65
71
return
66
72
}
67
- var queue = job . user
68
- ? this . userQueue
69
- : this . queue
70
- queue . push ( job )
71
- this . has [ job . id ] = job
72
- if ( ! this . waiting ) {
73
- this . waiting = true
74
- _ . nextTick ( this . flush , this )
73
+ ; ( job . user ? userQueue : queue ) . push ( job )
74
+ has [ job . id ] = job
75
+ if ( ! waiting ) {
76
+ waiting = true
77
+ _ . nextTick ( flush )
75
78
}
76
79
}
77
- }
78
-
79
- /**
80
- * Flush both queues and run the jobs.
81
- */
82
-
83
- p . flush = function ( ) {
84
- this . flushing = true
85
- run ( this . queue )
86
- run ( this . userQueue )
87
- this . reset ( )
88
- }
89
-
90
- /**
91
- * Run the jobs in a single queue.
92
- *
93
- * @param {Array } queue
94
- */
95
-
96
- function run ( queue ) {
97
- // do not cache length because more jobs might be pushed
98
- // as we run existing jobs
99
- for ( var i = 0 ; i < queue . length ; i ++ ) {
100
- queue [ i ] . run ( )
101
- }
102
- }
103
-
104
- module . exports = Batcher
80
+ }
0 commit comments