253 lines
6.9 KiB
JavaScript
253 lines
6.9 KiB
JavaScript
/* *
|
|
*
|
|
* (c) 2020-2022 Highsoft AS
|
|
*
|
|
* License: www.highcharts.com/license
|
|
*
|
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|
*
|
|
* Authors:
|
|
* - Sophie Bremer
|
|
*
|
|
* */
|
|
'use strict';
|
|
/* *
|
|
*
|
|
* Imports
|
|
*
|
|
* */
|
|
import H from '../Core/Globals.js';
|
|
/* *
|
|
*
|
|
* Constants
|
|
*
|
|
* */
|
|
var win = H.win;
|
|
var delay = setTimeout;
|
|
/* *
|
|
*
|
|
* Class
|
|
*
|
|
* */
|
|
/**
|
|
* Simplified wrapper for Promise-support in outdated browsers.
|
|
*/
|
|
var DataPromise = /** @class */ (function () {
|
|
/* *
|
|
*
|
|
* Constructor
|
|
*
|
|
* */
|
|
function DataPromise(executor) {
|
|
/* *
|
|
*
|
|
* Properties
|
|
*
|
|
* */
|
|
this.jobs = [];
|
|
this.state = DataPromise.State.Pending;
|
|
this.value = void 0;
|
|
if (win.Promise && !DataPromise.onlyPolyfill) {
|
|
return new win.Promise(executor);
|
|
}
|
|
var promise = this;
|
|
delay(function () {
|
|
try {
|
|
executor(function (value) { return promise.resolved(value); }, function (reason) { return promise.rejected(reason); });
|
|
}
|
|
catch (e) {
|
|
promise.rejected(e);
|
|
}
|
|
}, 0);
|
|
}
|
|
/* *
|
|
*
|
|
* Static Functions
|
|
*
|
|
* */
|
|
DataPromise.isPromiseLike = function (promise) {
|
|
return (typeof promise === 'object' &&
|
|
promise !== null &&
|
|
typeof promise.then === 'function');
|
|
};
|
|
DataPromise.reject = function (reason) {
|
|
if (win.Promise && !DataPromise.onlyPolyfill) {
|
|
return win.Promise.reject(reason);
|
|
}
|
|
return new DataPromise(function (resolve, reject) { return reject(reason); });
|
|
};
|
|
DataPromise.resolve = function (value) {
|
|
if (win.Promise && !DataPromise.onlyPolyfill) {
|
|
return win.Promise.resolve(value);
|
|
}
|
|
if (DataPromise.isPromiseLike(value)) {
|
|
return new DataPromise(function (resolve, reject) {
|
|
value.then(resolve, reject);
|
|
});
|
|
}
|
|
return new DataPromise(function (resolve) { return resolve(value); });
|
|
};
|
|
/* *
|
|
*
|
|
* Functions
|
|
*
|
|
* */
|
|
DataPromise.prototype['catch'] = function (onrejected) {
|
|
return this.then(null, onrejected);
|
|
};
|
|
DataPromise.prototype.rejected = function (reason) {
|
|
var promise = this;
|
|
if (promise.state === DataPromise.State.Pending) {
|
|
promise.state = DataPromise.State.Rejected;
|
|
promise.reason = reason;
|
|
delay(function () { return promise.work(); }, 0);
|
|
}
|
|
};
|
|
DataPromise.prototype.resolved = function (value) {
|
|
var promise = this;
|
|
if (promise.state === DataPromise.State.Pending) {
|
|
if (DataPromise.isPromiseLike(value)) {
|
|
value.then(function (value) { return promise.resolved(value); }, function (reason) { return promise.rejected(reason); });
|
|
}
|
|
else {
|
|
promise.state = DataPromise.State.Fulfilled;
|
|
promise.value = value;
|
|
delay(function () { return promise.work(); }, 0);
|
|
}
|
|
}
|
|
};
|
|
DataPromise.prototype.then = function (onfulfilled, onrejected) {
|
|
var promise = this, newPromise = new DataPromise(function () { return void 0; }), rejecter = function (reason) {
|
|
if (onrejected) {
|
|
try {
|
|
var result = onrejected(reason);
|
|
if (result instanceof DataPromise) {
|
|
result.then(function (value) {
|
|
return newPromise.resolved(value);
|
|
}, function (reason) {
|
|
return newPromise.rejected(reason);
|
|
});
|
|
}
|
|
else {
|
|
newPromise.resolved(result);
|
|
}
|
|
return;
|
|
}
|
|
catch (e) {
|
|
reason = e;
|
|
}
|
|
}
|
|
if (newPromise.jobs.length) {
|
|
newPromise.rejected(reason);
|
|
}
|
|
else if (reason) {
|
|
throw reason;
|
|
}
|
|
else {
|
|
throw new Error('Unhandled exception');
|
|
}
|
|
}, resolver = function (value) {
|
|
if (onfulfilled) {
|
|
try {
|
|
var result = onfulfilled(value);
|
|
if (result instanceof DataPromise) {
|
|
result.then(function (value) {
|
|
return newPromise.resolved(value);
|
|
}, function (reason) {
|
|
return newPromise.rejected(reason);
|
|
});
|
|
}
|
|
else {
|
|
newPromise.resolved(result);
|
|
}
|
|
}
|
|
catch (e) {
|
|
rejecter(e);
|
|
}
|
|
}
|
|
else {
|
|
newPromise.resolved(value);
|
|
}
|
|
};
|
|
switch (promise.state) {
|
|
case DataPromise.State.Fulfilled:
|
|
resolver(promise.value);
|
|
break;
|
|
case DataPromise.State.Rejected:
|
|
rejecter(promise.reason);
|
|
break;
|
|
default:
|
|
promise.jobs.push({
|
|
resolve: resolver,
|
|
reject: rejecter
|
|
});
|
|
break;
|
|
}
|
|
return newPromise;
|
|
};
|
|
DataPromise.prototype.work = function () {
|
|
var promise = this, jobs = promise.jobs;
|
|
var job, rejectHandled;
|
|
while ((job = jobs.shift())) {
|
|
try {
|
|
if (promise.state === DataPromise.State.Fulfilled) {
|
|
job.resolve(promise.value);
|
|
}
|
|
else if (job.reject) {
|
|
rejectHandled = true;
|
|
job.reject(promise.reason);
|
|
}
|
|
}
|
|
catch (e) {
|
|
rejectHandled = false;
|
|
promise.reason = e;
|
|
promise.state = DataPromise.State.Rejected;
|
|
}
|
|
}
|
|
if (rejectHandled === false) {
|
|
if (promise.reason) {
|
|
throw promise.reason;
|
|
}
|
|
else {
|
|
throw new Error('Unhandled rejection');
|
|
}
|
|
}
|
|
};
|
|
/* *
|
|
*
|
|
* Static Properties
|
|
*
|
|
* */
|
|
DataPromise.onlyPolyfill = false;
|
|
return DataPromise;
|
|
}());
|
|
/* *
|
|
*
|
|
* Class Namespace
|
|
*
|
|
* */
|
|
(function (DataPromise) {
|
|
/* *
|
|
*
|
|
* Declarations
|
|
*
|
|
* */
|
|
/* *
|
|
*
|
|
* Enumerations
|
|
*
|
|
* */
|
|
var State;
|
|
(function (State) {
|
|
State[State["Fulfilled"] = 2] = "Fulfilled";
|
|
State[State["Pending"] = 0] = "Pending";
|
|
State[State["Rejected"] = 1] = "Rejected";
|
|
})(State = DataPromise.State || (DataPromise.State = {}));
|
|
})(DataPromise || (DataPromise = {}));
|
|
/* *
|
|
*
|
|
* Default Export
|
|
*
|
|
* */
|
|
export default DataPromise;
|