You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.7 KiB
60 lines
1.7 KiB
2 years ago
|
var Class = require('./Class');
|
||
|
var toArr = require('./toArr');
|
||
|
var each = require('./each');
|
||
|
var map = require('./map');
|
||
|
var noop = require('./noop');
|
||
|
var some = require('./some');
|
||
|
exports = Class({
|
||
|
initialize: function Readiness() {
|
||
|
this._promises = {};
|
||
|
this._resolves = {};
|
||
|
this._states = {};
|
||
|
},
|
||
|
signal: function(tasks) {
|
||
|
var states = this._states;
|
||
|
each(this._getPromises(toArr(tasks)), function(val) {
|
||
|
if (!val.state) {
|
||
|
states[val.task] = true;
|
||
|
val.resolve();
|
||
|
}
|
||
|
});
|
||
|
},
|
||
|
isReady: function(tasks) {
|
||
|
return !some(this._getPromises(toArr(tasks)), function(val) {
|
||
|
return !val.state;
|
||
|
});
|
||
|
},
|
||
|
ready: function(tasks) {
|
||
|
var fn =
|
||
|
arguments.length > 1 && arguments[1] !== undefined
|
||
|
? arguments[1]
|
||
|
: noop;
|
||
|
return Promise.all(
|
||
|
map(this._getPromises(toArr(tasks)), function(val) {
|
||
|
return val.promise;
|
||
|
})
|
||
|
).then(fn);
|
||
|
},
|
||
|
_getPromises: function(tasks) {
|
||
|
var promises = this._promises;
|
||
|
var resolves = this._resolves;
|
||
|
var states = this._states;
|
||
|
return map(tasks, function(task) {
|
||
|
if (!promises[task]) {
|
||
|
promises[task] = new Promise(function(resolve) {
|
||
|
resolves[task] = resolve;
|
||
|
states[task] = false;
|
||
|
});
|
||
|
}
|
||
|
return {
|
||
|
task: task,
|
||
|
promise: promises[task],
|
||
|
resolve: resolves[task],
|
||
|
state: states[task]
|
||
|
};
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
|
||
|
module.exports = exports;
|