Readiness.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. var Class = require('./Class');
  2. var toArr = require('./toArr');
  3. var each = require('./each');
  4. var map = require('./map');
  5. var noop = require('./noop');
  6. var some = require('./some');
  7. exports = Class({
  8. initialize: function Readiness() {
  9. this._promises = {};
  10. this._resolves = {};
  11. this._states = {};
  12. },
  13. signal: function(tasks) {
  14. var states = this._states;
  15. each(this._getPromises(toArr(tasks)), function(val) {
  16. if (!val.state) {
  17. states[val.task] = true;
  18. val.resolve();
  19. }
  20. });
  21. },
  22. isReady: function(tasks) {
  23. return !some(this._getPromises(toArr(tasks)), function(val) {
  24. return !val.state;
  25. });
  26. },
  27. ready: function(tasks) {
  28. var fn =
  29. arguments.length > 1 && arguments[1] !== undefined
  30. ? arguments[1]
  31. : noop;
  32. return Promise.all(
  33. map(this._getPromises(toArr(tasks)), function(val) {
  34. return val.promise;
  35. })
  36. ).then(fn);
  37. },
  38. _getPromises: function(tasks) {
  39. var promises = this._promises;
  40. var resolves = this._resolves;
  41. var states = this._states;
  42. return map(tasks, function(task) {
  43. if (!promises[task]) {
  44. promises[task] = new Promise(function(resolve) {
  45. resolves[task] = resolve;
  46. states[task] = false;
  47. });
  48. }
  49. return {
  50. task: task,
  51. promise: promises[task],
  52. resolve: resolves[task],
  53. state: states[task]
  54. };
  55. });
  56. }
  57. });
  58. module.exports = exports;