function allSettled(promises) {
return new Promise((resolve, reject) => {
promises = Array.isArray(promises) ? promises : []
let len = promises.length
const argslen = len
if (len === 0) return resolve([])
let args = Array.prototype.slice.call(promises)
for (let i = 0; i < argslen; i++) {
resolvePromise(i, args[i])
}
const compute = () => {
if (--len === 0) {
resolve(args)
}
}
function resolvePromise(index, value) {
if (value instanceof Promise) {
const then = value.then
then.call(value, val => {
args[index] = { status: 'fulfilled', val }
compute()
}, e => {
args[index] = { status: 'rejected', e }
compute()
})
} else {
args[index] = { status: 'fulfilled', value }
compute()
}
}
})
}
const p1 = Promise.resolve(1)
const p2 = Promise.resolve(2)
const p3 = new Promise((resolve, reject) => {
setTimeout(reject, 1000, 'three');
});
allSettled([p1, p2, p3])
.then(values => {
console.log(values)
})
console