DEV Community

Discussion on: Rebuilding Promise.all()

Collapse
lionelrowe profile image
lionel-rowe • Edited on

Bugfixed version:

Spoiler

We write directly to indexes in the array, instead of pushing, and keep track of the resolved count in a separate variable.

const promiseAll = promises => {
    return new Promise((resolve, reject) => {
        const values = new Array(promises.length)

        let resolvedCount = 0

        for (const [index, promise] of promises.entries()) {
            promise.then(value => {
                values[index] = value

                if (++resolvedCount === promises.length) {
                    resolve(values)
                }
            }).catch(err => reject(err))
        }
    })
}
Enter fullscreen mode Exit fullscreen mode

Collapse
drewclem profile image
Drew Clements Author

Beautiful!!

Collapse
lionelrowe profile image
lionel-rowe

Can be made a little more elegant at the cost of a little performance like this:

const isDense = arr => arr.length === Object.keys(arr).length
// ...
if (isDense(values)) {
    resolve(values)
}
Enter fullscreen mode Exit fullscreen mode

That way we can get rid of the resolvedCount variable.

But I think @darkwiiplayer 's second solution is by far the most elegant 😉