choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
250 lines (202 loc) • 6.45 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _isPromise = _interopRequireDefault(require("is-promise"));
var _utils = require("../data-set/utils");
function isPromiseCallback(task) {
return typeof task === 'function';
}
var PromiseTask = /*#__PURE__*/function () {
function PromiseTask(task) {
(0, _classCallCheck2["default"])(this, PromiseTask);
this[Symbol.toStringTag] = 'Promise';
this.task = task;
if ((0, _isPromise["default"])(task)) {
this.promise = task;
}
}
(0, _createClass2["default"])(PromiseTask, [{
key: "run",
value: function run() {
var _this = this;
var promise = this.promise;
if (promise) {
return promise;
}
var task = this.task;
if (isPromiseCallback(task)) {
var newPromise = task();
this.promise = newPromise;
var resolveCallbacks = this.resolveCallbacks,
rejectCallbacks = this.rejectCallbacks;
if (resolveCallbacks && resolveCallbacks.length) {
newPromise.then(function (v) {
resolveCallbacks.forEach(function (cb) {
return cb(v);
});
delete _this.resolveCallbacks;
return v;
});
}
if (rejectCallbacks && rejectCallbacks.length) {
newPromise["catch"](function (v) {
rejectCallbacks.forEach(function (cb) {
return cb(v);
});
delete _this.rejectCallbacks;
throw v;
});
}
return newPromise;
}
return task;
}
}, {
key: "catch",
value: function _catch(onrejected) {
var _this2 = this;
var promise = this.promise;
if (promise) {
return promise["catch"](onrejected && function (error) {
return onrejected(error);
});
}
return new Promise(function (_, reject) {
var rejectCallbacks = (0, _utils.getIf)(_this2, 'rejectCallbacks', []);
rejectCallbacks.push(function (v) {
return reject(onrejected ? onrejected(v) : v);
});
});
}
}, {
key: "then",
value: function then(onfulfilled, onrejected) {
var _this3 = this;
var promise = this.promise;
if (promise) {
return promise.then(onfulfilled && function (value) {
return onfulfilled(value);
}, onrejected && function (error) {
return onrejected(error);
});
}
return new Promise(function (resolve, reject) {
var resolveCallbacks = (0, _utils.getIf)(_this3, 'resolveCallbacks', []);
var rejectCallbacks = (0, _utils.getIf)(_this3, 'rejectCallbacks', []);
resolveCallbacks.push(function (v) {
return resolve(onfulfilled ? onfulfilled(v) : v);
});
rejectCallbacks.push(function (v) {
return reject(onrejected ? onrejected(v) : v);
});
});
}
}]);
return PromiseTask;
}();
var PromiseQueue = /*#__PURE__*/function () {
function PromiseQueue() {
var _this4 = this;
var threads = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
(0, _classCallCheck2["default"])(this, PromiseQueue);
this.queue = [];
this.queueing = false;
this.$nextTask = function () {
var task = _this4.queue.shift();
if (task) {
return task.run().then(function () {
if (_this4.queueing) {
return _this4.$nextTask();
}
})["catch"](function (error) {
_this4.stop();
throw error;
});
}
return Promise.resolve();
};
if (threads < 1) {
throw new Error('The first argument of PromiseQueue constructor must be greater than 0.');
}
this.threads = threads;
}
(0, _createClass2["default"])(PromiseQueue, [{
key: "$clear",
value: function $clear(promise) {
if (!this.queueing) {
var queue = this.queue;
var index = queue.indexOf(promise);
if (index !== -1) {
queue.splice(index, 1);
}
}
}
}, {
key: "add",
value: function add(promise) {
var _this5 = this;
var queue = this.queue;
var task = new PromiseTask(promise);
queue.push(task);
return task.then(function (value) {
_this5.$clear(task);
return value;
})["catch"](function (error) {
_this5.$clear(task);
throw error;
});
}
}, {
key: "stop",
value: function stop() {
this.queueing = false;
}
}, {
key: "ready",
value: function () {
var _ready = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
var _this6 = this;
var queue, threads;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
queue = this.queue, threads = this.threads;
if (!queue.length) {
_context.next = 9;
break;
}
this.queueing = true;
_context.prev = 3;
_context.next = 6;
return Promise.all(new Array(threads).fill(0).map(function () {
return _this6.$nextTask();
}));
case 6:
_context.prev = 6;
this.queueing = false;
return _context.finish(6);
case 9:
case "end":
return _context.stop();
}
}
}, _callee, this, [[3,, 6, 9]]);
}));
function ready() {
return _ready.apply(this, arguments);
}
return ready;
}()
}]);
return PromiseQueue;
}();
exports["default"] = PromiseQueue;
//# sourceMappingURL=index.js.map