devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
183 lines (177 loc) • 5.97 kB
JavaScript
/**
* DevExtreme (cjs/__internal/core/utils/m_deferred.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Deferred = Deferred;
exports.fromPromise = fromPromise;
exports.setStrategy = setStrategy;
exports.when = when;
var _callbacks = _interopRequireDefault(require("../../../core/utils/callbacks"));
var _extend = require("../../../core/utils/extend");
var _type = require("../../../core/utils/type");
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
const deferredConfig = [{
method: "resolve",
handler: "done",
state: "resolved"
}, {
method: "reject",
handler: "fail",
state: "rejected"
}, {
method: "notify",
handler: "progress"
}];
let DeferredObj = function() {
const that = this;
this._state = "pending";
this._promise = {};
deferredConfig.forEach(function(config) {
const methodName = config.method;
this[`${methodName}Callbacks`] = (0, _callbacks.default)();
this[methodName] = function() {
return this[`${methodName}With`](this._promise, arguments)
}.bind(this);
this._promise[config.handler] = function(handler) {
if (!handler) {
return this
}
const callbacks = that[`${methodName}Callbacks`];
if (callbacks.fired()) {
handler.apply(that[`${methodName}Context`], that[`${methodName}Args`])
} else {
callbacks.add((function(context, args) {
handler.apply(context, args)
}))
}
return this
}
}.bind(this));
this._promise.always = function(handler) {
return this.done(handler).fail(handler)
};
this._promise.catch = function(handler) {
return this.then(null, handler)
};
this._promise.then = function(resolve, reject) {
const result = new DeferredObj;
["done", "fail"].forEach(function(method) {
const callback = "done" === method ? resolve : reject;
this[method]((function() {
if (!callback) {
result["done" === method ? "resolve" : "reject"].apply(this, arguments);
return
}
const callbackResult = callback && callback.apply(this, arguments);
if ((0, _type.isDeferred)(callbackResult)) {
callbackResult.done(result.resolve).fail(result.reject)
} else if ((0, _type.isPromise)(callbackResult)) {
callbackResult.then(result.resolve, result.reject)
} else {
result.resolve.apply(this, (0, _type.isDefined)(callbackResult) ? [callbackResult] : arguments)
}
}))
}.bind(this));
return result.promise()
};
this._promise.state = function() {
return that._state
};
this._promise.promise = function(args) {
return args ? (0, _extend.extend)(args, that._promise) : that._promise
};
this._promise.promise(this)
};
deferredConfig.forEach((function(config) {
const methodName = config.method;
const {
state: state
} = config;
DeferredObj.prototype[`${methodName}With`] = function(context, args) {
const callbacks = this[`${methodName}Callbacks`];
if ("pending" === this.state()) {
this[`${methodName}Args`] = args;
this[`${methodName}Context`] = context;
if (state) {
this._state = state
}
callbacks.fire(context, args);
if ("pending" !== state) {
this.resolveCallbacks.empty();
this.rejectCallbacks.empty()
}
}
return this
}
}));
function fromPromise(promise, context) {
if ((0, _type.isDeferred)(promise)) {
return promise
}
if ((0, _type.isPromise)(promise)) {
const d = new DeferredObj;
promise.then((function() {
d.resolveWith.apply(d, [context].concat([
[].slice.call(arguments)
]))
}), (function() {
d.rejectWith.apply(d, [context].concat([
[].slice.call(arguments)
]))
}));
return d
}
return (new DeferredObj).resolveWith(context, [promise])
}
let whenFunc = function() {
if (1 === arguments.length) {
return fromPromise(arguments[0])
}
const values = [].slice.call(arguments);
const contexts = [];
let resolvedCount = 0;
const deferred = new DeferredObj;
const updateState = function(i) {
return function(value) {
contexts[i] = this;
values[i] = arguments.length > 1 ? [].slice.call(arguments) : value;
resolvedCount++;
if (resolvedCount === values.length) {
deferred.resolveWith(contexts, values)
}
}
};
for (let i = 0; i < values.length; i++) {
if ((0, _type.isDeferred)(values[i])) {
values[i].promise().done(updateState(i)).fail(deferred.reject)
} else {
resolvedCount++
}
}
if (resolvedCount === values.length) {
deferred.resolveWith(contexts, values)
}
return deferred.promise()
};
function setStrategy(value) {
DeferredObj = value.Deferred;
whenFunc = value.when
}
function Deferred() {
return new DeferredObj
}
function when() {
return whenFunc.apply(this, arguments)
}