Last active
May 16, 2021 15:36
-
-
Save wangziling/938e473d066037396d101e1f43984897 to your computer and use it in GitHub Desktop.
jQuery ajax/deferred `Promise.allSettled`
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @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