From 3abce7aa0aab51df7596feec5b75609dd5b8b113 Mon Sep 17 00:00:00 2001 From: Rafael Weinstein Date: Mon, 6 Jan 2014 09:48:28 -0800 Subject: [PATCH] runEOM We only have one mechanism left that explicitly needs to wait to EOM to run which is responding to assignment to template.model. This private API will be used by TemplateBinding, and allow the removal of the more complex and expensive ensureScheduled. R=arv BUG= Review URL: https://codereview.appspot.com/48100043 --- src/observe.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/observe.js b/src/observe.js index d3235f1..4edc1a0 100644 --- a/src/observe.js +++ b/src/observe.js @@ -343,6 +343,41 @@ }; } + var eomTasks = []; + function runEOMTasks() { + if (!eomTasks.length) + return false; + + for (var i = 0; i < eomTasks.length; i++) { + eomTasks[i](); + } + eomTasks.length = 0; + return true; + } + + var runEOM = hasObserve ? (function(){ + var eomObj = { pingPong: true }; + var eomRunScheduled = false; + + Object.observe(eomObj, function() { + runEOMTasks(); + eomRunScheduled = false; + }); + + return function(fn) { + eomTasks.push(fn); + if (!eomRunScheduled) { + eomRunScheduled = true; + eomObj.pingPong = !eomObj.pingPong; + } + }; + })() : + (function() { + return function(fn) { + eomTasks.push(fn); + }; + })(); + var observedObjectCache = []; function newObservedObject() { @@ -589,6 +624,8 @@ allObservers.push(observer); } + if (runEOMTasks()) + anyChanged = true; } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged); if (global.testingExposeCycleCount) @@ -1456,6 +1493,7 @@ } global.Observer = Observer; + global.Observer.runEOM_ = runEOM; global.Observer.hasObjectObserve = hasObserve; global.ArrayObserver = ArrayObserver; global.ArrayObserver.calculateSplices = function(current, previous) {