Skip to content

Instantly share code, notes, and snippets.

@wangziling
Last active May 16, 2021 15:36
Show Gist options
  • Save wangziling/938e473d066037396d101e1f43984897 to your computer and use it in GitHub Desktop.
Save wangziling/938e473d066037396d101e1f43984897 to your computer and use it in GitHub Desktop.
jQuery ajax/deferred `Promise.allSettled`
/**
* @typedef {{ status: 'fulfilled', value: *}} TPromiseAllSettledFulfilledResult
* @typedef {{ status: 'rejected', reason: (*|Error) }} TPromiseAllSettledRejectedResult
* @typedef {(TPromiseAllSettledFulfilledResult|TPromiseAllSettledRejectedResult)[]} TDeferAllSettledResult
*/
/**
* Same as `Promise.allSettled`.
* Try hard to not to use `Promise`, all from JQuery.
* @param deferIterator {JQuery.Deferred[]|JQuery.jqXHR[]|Object<string, JQuery.Deferred>}
* @return {JQuery.Deferred<TDeferAllSettledResult>}
*/
function deferAllSettled (deferIterator) {
/**
* Internal. This will be returned out to identify all deferInstance resolved/rejected.
* @param {JQuery.Deferred} dtd
* @return {JQuery.Deferred}
*/
function _deferAllSettled (dtd) {
/**
* @type {JQuery.Deferred<*>[]}
*/
const iteratorArr = Object.values(deferIterator);
let len = iteratorArr.length;
const result = new Array(len);
if (!len) return dtd.resolve(result);
iteratorArr.forEach(function (iterator, index) {
iterator
.then(function (value) {
return result[index] = {
status: 'fulfilled',
value
};
})
.catch(function (reason) {
return result[index] = {
status: 'rejected',
reason
};
})
.always(function () {
len--;
// If all executed and got the result or reason.
if (!len) {
return dtd.resolve(result);
}
});
});
return dtd;
}
return $.when(_deferAllSettled($.Deferred()));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment