|
9 | 9 | -->
|
10 | 10 | <script>
|
11 | 11 |
|
12 |
| -Polymer.Async = (function() { |
13 |
| - |
14 |
| - var currVal = 0; |
15 |
| - var lastVal = 0; |
16 |
| - var callbacks = []; |
17 |
| - var twiddle = document.createTextNode(''); |
| 12 | +Polymer.Async = { |
18 | 13 |
|
19 |
| - function runAsync(callback, waitTime) { |
| 14 | + _currVal: 0, |
| 15 | + _lastVal: 0, |
| 16 | + _callbacks: [], |
| 17 | + _twiddleContent: 0, |
| 18 | + _twiddle: document.createTextNode(''), |
| 19 | + |
| 20 | + run: function (callback, waitTime) { |
20 | 21 | if (waitTime > 0) {
|
21 | 22 | return ~setTimeout(callback, waitTime);
|
22 | 23 | } else {
|
23 |
| - twiddle.textContent = currVal++; |
24 |
| - callbacks.push(callback); |
25 |
| - return currVal - 1; |
| 24 | + this._twiddle.textContent = this._twiddleContent++; |
| 25 | + this._callbacks.push(callback); |
| 26 | + return this._currVal++; |
26 | 27 | }
|
27 |
| - } |
| 28 | + }, |
28 | 29 |
|
29 |
| - function cancelAsync(handle) { |
| 30 | + cancel: function(handle) { |
30 | 31 | if (handle < 0) {
|
31 | 32 | clearTimeout(~handle);
|
32 | 33 | } else {
|
33 |
| - var idx = handle - lastVal; |
| 34 | + var idx = handle - this._lastVal; |
34 | 35 | if (idx >= 0) {
|
35 |
| - if (!callbacks[idx]) { |
| 36 | + if (!this._callbacks[idx]) { |
36 | 37 | throw 'invalid async handle: ' + handle;
|
37 | 38 | }
|
38 |
| - callbacks[idx] = null; |
| 39 | + this._callbacks[idx] = null; |
39 | 40 | }
|
40 | 41 | }
|
41 |
| - } |
| 42 | + }, |
42 | 43 |
|
43 |
| - function atEndOfMicrotask() { |
44 |
| - var len = callbacks.length; |
| 44 | + _atEndOfMicrotask: function() { |
| 45 | + var len = this._callbacks.length; |
45 | 46 | for (var i=0; i<len; i++) {
|
46 |
| - var cb = callbacks[i]; |
| 47 | + var cb = this._callbacks[i]; |
47 | 48 | if (cb) {
|
48 |
| - cb(); |
| 49 | + try { |
| 50 | + cb(); |
| 51 | + } catch(e) { |
| 52 | + // Clear queue up to this point & start over after throwing |
| 53 | + i++; |
| 54 | + this._callbacks.splice(0, i); |
| 55 | + this._lastVal += i; |
| 56 | + this._twiddle.textContent = this._twiddleContent++; |
| 57 | + throw e; |
| 58 | + } |
49 | 59 | }
|
50 | 60 | }
|
51 |
| - callbacks.splice(0, len); |
52 |
| - lastVal += len; |
| 61 | + this._callbacks.splice(0, len); |
| 62 | + this._lastVal += len; |
53 | 63 | }
|
| 64 | +}; |
54 | 65 |
|
55 |
| - new (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask) |
56 |
| - .observe(twiddle, {characterData: true}) |
57 |
| - ; |
58 |
| - |
59 |
| - // exports |
60 |
| - |
61 |
| - return { |
62 |
| - run: runAsync, |
63 |
| - cancel: cancelAsync |
64 |
| - }; |
65 |
| - |
66 |
| -})(); |
| 66 | +new (window.MutationObserver || JsMutationObserver) |
| 67 | + (Polymer.Async._atEndOfMicrotask.bind(Polymer.Async)) |
| 68 | + .observe(Polymer.Async._twiddle, {characterData: true}); |
67 | 69 |
|
68 | 70 | </script>
|
0 commit comments