art-standard-lib
Version:
The Standard Library for JavaScript that aught to be.
90 lines (73 loc) • 2.64 kB
JavaScript
// Generated by CoffeeScript 1.12.7
(function() {
var Promise, PromiseWorkerPool, log;
Promise = require('./Promise');
log = require('./Log').log;
/*
usage:
pwp = new PromiseWorkerPool
numWorkers: 10
* queue all your jobs
pwp.queue (jobIndex, totalJobCount) -> work, optionally returning promise
* jobIndex is the order the worker was queued in
* start the queue
pwp.then (results) ->
* results is the results from all your workerPromises in the same order they were queued
*/
module.exports = PromiseWorkerPool = (function() {
function PromiseWorkerPool(numWorkers1) {
this.numWorkers = numWorkers1 != null ? numWorkers1 : 10;
this._queue = [];
}
PromiseWorkerPool.prototype.queue = function(job) {
if (this._startPromise) {
throw new Error("already started");
}
this._queue.push(job);
return this;
};
PromiseWorkerPool.prototype.start = function() {
return this._startPromise || (this._startPromise = Promise.then((function(_this) {
return function() {
var doNextAction, jobIndex, numJobs, numWorkers, results, workerPromises;
jobIndex = 0;
doNextAction = function() {
var currentJobIndex, job;
if (_this._queue.length > (currentJobIndex = jobIndex)) {
jobIndex++;
if (job = _this._queue[currentJobIndex]) {
_this._queue[currentJobIndex] = null;
return Promise.then(function() {
return job(currentJobIndex, numJobs);
}).then(function(result) {
return results[currentJobIndex] = result;
}).then(doNextAction);
} else {
return Promise.then(doNextAction);
}
} else {
return Promise.resolve("queue done");
}
};
results = new Array(numJobs = _this._queue.length);
workerPromises = [];
numWorkers = _this.numWorkers;
while (workerPromises.length < numWorkers) {
workerPromises.push(doNextAction());
}
return Promise.all(workerPromises).then(function() {
return results;
});
};
})(this)));
};
PromiseWorkerPool.prototype.then = function(a, b) {
return this.start().then(a, b);
};
PromiseWorkerPool.prototype["catch"] = function(a) {
return this.start()["catch"](a);
};
return PromiseWorkerPool;
})();
}).call(this);
//# sourceMappingURL=PromiseWorkerPool.js.map