Kaynağa Gözat

ensure correct watcher invocation order for changes triggered inside user watchers (fix #2750)

Evan You 10 yıl önce
ebeveyn
işleme
aca70e09dc
1 değiştirilmiş dosya ile 12 ekleme ve 19 silme
  1. 12 19
      src/batcher.js

+ 12 - 19
src/batcher.js

@@ -12,7 +12,6 @@ import {
 // triggered, the DOM would have already been in updated
 // state.
 
-var queueIndex
 var queue = []
 var userQueue = []
 var has = {}
@@ -57,8 +56,8 @@ function flushBatcherQueue () {
 function runBatcherQueue (queue) {
   // do not cache length because more watchers might be pushed
   // as we run existing watchers
-  for (queueIndex = 0; queueIndex < queue.length; queueIndex++) {
-    var watcher = queue[queueIndex]
+  for (let i = 0; i < queue.length; i++) {
+    var watcher = queue[i]
     var id = watcher.id
     has[id] = null
     watcher.run()
@@ -91,22 +90,16 @@ function runBatcherQueue (queue) {
 export function pushWatcher (watcher) {
   var id = watcher.id
   if (has[id] == null) {
-    if (internalQueueDepleted && !watcher.user) {
-      // an internal watcher triggered by a user watcher...
-      // let's run it immediately after current user watcher is done.
-      userQueue.splice(queueIndex + 1, 0, watcher)
-    } else {
-      // push watcher into appropriate queue
-      var q = watcher.user
-        ? userQueue
-        : queue
-      has[id] = q.length
-      q.push(watcher)
-      // queue the flush
-      if (!waiting) {
-        waiting = true
-        nextTick(flushBatcherQueue)
-      }
+    // push watcher into appropriate queue
+    var q = internalQueueDepleted || watcher.user
+      ? userQueue
+      : queue
+    has[id] = true
+    q.push(watcher)
+    // queue the flush
+    if (!waiting) {
+      waiting = true
+      nextTick(flushBatcherQueue)
     }
   }
 }