Selaa lähdekoodia

more aggressively remove renderqueue tasks

Adam Shaw 8 vuotta sitten
vanhempi
sitoutus
dfa8b504a0
2 muutettua tiedostoa jossa 27 lisäystä ja 17 poistoa
  1. 26 16
      src/common/RenderQueue.js
  2. 1 1
      tests/automated-better/util/RenderQueue.js

+ 26 - 16
src/common/RenderQueue.js

@@ -110,26 +110,36 @@ var RenderQueue = TaskQueue.extend({
 	compoundTask: function(newTask) {
 		var q = this.q;
 		var shouldAppend = true;
-		var i, lastTask;
+		var i, task;
 
-		if (newTask.type === 'destroy') {
+		if (newTask.namespace && newTask.type === 'destroy') {
 
-			while (q.length) {
-				lastTask = q[q.length - 1];
-
-				if (newTask.namespace && newTask.namespace === lastTask.namespace) {
-
-					if (lastTask.type === 'add' || lastTask.type === 'remove') {
-						q.pop();
-						continue;
-					}
-					else if (lastTask.type === 'init') {
-						q.pop();
-						shouldAppend = false;
-					}
+			// remove all add/remove ops with same namespace, regardless of order
+			for (i = q.length - 1; i >= 0; i--) {
+				task = q[i];
+
+				if (
+					task.namespace === newTask.namespace &&
+					(task.type === 'add' || task.type === 'remove')
+				) {
+					q.splice(i, 1); // remove task
 				}
+			}
 
-				break;
+			// eat away queued init operations
+			while (q.length) {
+				task = q[q.length - 1]; // last task
+
+				if (
+					task.namespace === newTask.namespace &&
+					task.type === 'init'
+				) {
+					q.pop();
+					shouldAppend = false;
+				}
+				else {
+					break;
+				}
 			}
 		}
 

+ 1 - 1
tests/automated-better/util/RenderQueue.js

@@ -58,7 +58,7 @@ describe('RenderQueue', function() {
 
 				q.queue(function() {
 					ops.push('barinit');
-				}, 'foo', 'init');
+				}, 'bar', 'init');
 
 				q.queue(function() {
 					ops.push('fooinit');