@@ -11,6 +11,8 @@ import {
11
11
// before user watchers so that when user watchers are
12
12
// triggered, the DOM would have already been in updated
13
13
// state.
14
+
15
+ var queueIndex
14
16
var queue = [ ]
15
17
var userQueue = [ ]
16
18
var has = { }
@@ -55,8 +57,8 @@ function flushBatcherQueue () {
55
57
function runBatcherQueue ( queue ) {
56
58
// do not cache length because more watchers might be pushed
57
59
// as we run existing watchers
58
- for ( var i = 0 ; i < queue . length ; i ++ ) {
59
- var watcher = queue [ i ]
60
+ for ( queueIndex = 0 ; queueIndex < queue . length ; queueIndex ++ ) {
61
+ var watcher = queue [ queueIndex ]
60
62
var id = watcher . id
61
63
has [ id ] = null
62
64
watcher . run ( )
@@ -88,20 +90,22 @@ function runBatcherQueue (queue) {
88
90
export function pushWatcher ( watcher ) {
89
91
var id = watcher . id
90
92
if ( has [ id ] == null ) {
91
- // if an internal watcher is pushed, but the internal
92
- // queue is already depleted, we run it immediately.
93
93
if ( internalQueueDepleted && ! watcher . user ) {
94
- watcher . run ( )
95
- return
96
- }
97
- // push watcher into appropriate queue
98
- var q = watcher . user ? userQueue : queue
99
- has [ id ] = q . length
100
- q . push ( watcher )
101
- // queue the flush
102
- if ( ! waiting ) {
103
- waiting = true
104
- nextTick ( flushBatcherQueue )
94
+ // an internal watcher triggered by a user watcher...
95
+ // let's run it immediately after current user watcher is done.
96
+ userQueue . splice ( queueIndex + 1 , 0 , watcher )
97
+ } else {
98
+ // push watcher into appropriate queue
99
+ var q = watcher . user
100
+ ? userQueue
101
+ : queue
102
+ has [ id ] = q . length
103
+ q . push ( watcher )
104
+ // queue the flush
105
+ if ( ! waiting ) {
106
+ waiting = true
107
+ nextTick ( flushBatcherQueue )
108
+ }
105
109
}
106
110
}
107
111
}
0 commit comments