|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"use strict"; |
|
var ASSERT = require("./assert.js"); |
|
var schedule = require("./schedule.js"); |
|
var Queue = require("./queue.js"); |
|
var errorObj = require("./util.js").errorObj; |
|
var tryCatch1 = require("./util.js").tryCatch1; |
|
|
|
function Async() { |
|
this._isTickUsed = false; |
|
this._length = 0; |
|
this._lateBuffer = new Queue(); |
|
this._functionBuffer = new Queue(25000 * 3); |
|
var self = this; |
|
this.consumeFunctionBuffer = function Async$consumeFunctionBuffer() { |
|
self._consumeFunctionBuffer(); |
|
}; |
|
} |
|
|
|
Async.prototype.haveItemsQueued = function Async$haveItemsQueued() { |
|
return this._length > 0; |
|
}; |
|
|
|
Async.prototype.invokeLater = function Async$invokeLater(fn, receiver, arg) { |
|
this._lateBuffer.push(fn, receiver, arg); |
|
this._queueTick(); |
|
}; |
|
|
|
Async.prototype.invoke = function Async$invoke(fn, receiver, arg) { |
|
var functionBuffer = this._functionBuffer; |
|
functionBuffer.push(fn, receiver, arg); |
|
this._length = functionBuffer.length(); |
|
this._queueTick(); |
|
}; |
|
|
|
Async.prototype._consumeFunctionBuffer = |
|
function Async$_consumeFunctionBuffer() { |
|
var functionBuffer = this._functionBuffer; |
|
while(functionBuffer.length() > 0) { |
|
var fn = functionBuffer.shift(); |
|
var receiver = functionBuffer.shift(); |
|
var arg = functionBuffer.shift(); |
|
fn.call(receiver, arg); |
|
} |
|
this._reset(); |
|
this._consumeLateBuffer(); |
|
}; |
|
|
|
Async.prototype._consumeLateBuffer = function Async$_consumeLateBuffer() { |
|
var buffer = this._lateBuffer; |
|
while(buffer.length() > 0) { |
|
var fn = buffer.shift(); |
|
var receiver = buffer.shift(); |
|
var arg = buffer.shift(); |
|
var res = tryCatch1(fn, receiver, arg); |
|
if (res === errorObj) { |
|
this._queueTick(); |
|
throw res.e; |
|
} |
|
} |
|
}; |
|
|
|
Async.prototype._queueTick = function Async$_queue() { |
|
if (!this._isTickUsed) { |
|
schedule(this.consumeFunctionBuffer); |
|
this._isTickUsed = true; |
|
} |
|
}; |
|
|
|
Async.prototype._reset = function Async$_reset() { |
|
this._isTickUsed = false; |
|
this._length = 0; |
|
}; |
|
|
|
module.exports = new Async(); |
|
|