Bones/node_modules/bluebird/js/main/async.js
SOUTHERNCO\x2mjbyrn 7efe7605b8 Template Upload
2017-05-17 13:45:25 -04:00

107 lines
2.7 KiB
JavaScript

"use strict";
var firstLineError;
try {throw new Error(); } catch (e) {firstLineError = e;}
var schedule = require("./schedule.js");
var Queue = require("./queue.js");
var _process = typeof process !== "undefined" ? process : undefined;
function Async() {
this._isTickUsed = false;
this._lateQueue = new Queue(16);
this._normalQueue = new Queue(16);
var self = this;
this.drainQueues = function () {
self._drainQueues();
};
this._schedule =
schedule.isStatic ? schedule(this.drainQueues) : schedule;
}
Async.prototype.haveItemsQueued = function () {
return this._normalQueue.length() > 0;
};
Async.prototype._withDomain = function(fn) {
if (_process !== undefined &&
_process.domain != null &&
!fn.domain) {
fn = _process.domain.bind(fn);
}
return fn;
};
Async.prototype.throwLater = function(fn, arg) {
if (arguments.length === 1) {
arg = fn;
fn = function () { throw arg; };
}
fn = this._withDomain(fn);
if (typeof setTimeout !== "undefined") {
setTimeout(function() {
fn(arg);
}, 0);
} else try {
this._schedule(function() {
fn(arg);
});
} catch (e) {
throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/m3OTXk\u000a");
}
};
Async.prototype.invokeLater = function (fn, receiver, arg) {
fn = this._withDomain(fn);
this._lateQueue.push(fn, receiver, arg);
this._queueTick();
};
Async.prototype.invokeFirst = function (fn, receiver, arg) {
fn = this._withDomain(fn);
this._normalQueue.unshift(fn, receiver, arg);
this._queueTick();
};
Async.prototype.invoke = function (fn, receiver, arg) {
fn = this._withDomain(fn);
this._normalQueue.push(fn, receiver, arg);
this._queueTick();
};
Async.prototype.settlePromises = function(promise) {
this._normalQueue._pushOne(promise);
this._queueTick();
};
Async.prototype._drainQueue = function(queue) {
while (queue.length() > 0) {
var fn = queue.shift();
if (typeof fn !== "function") {
fn._settlePromises();
continue;
}
var receiver = queue.shift();
var arg = queue.shift();
fn.call(receiver, arg);
}
};
Async.prototype._drainQueues = function () {
this._drainQueue(this._normalQueue);
this._reset();
this._drainQueue(this._lateQueue);
};
Async.prototype._queueTick = function () {
if (!this._isTickUsed) {
this._isTickUsed = true;
this._schedule(this.drainQueues);
}
};
Async.prototype._reset = function () {
this._isTickUsed = false;
};
module.exports = new Async();
module.exports.firstLineError = firstLineError;