↩︎

await-reduce

Resolve and reduce an array of promises

const reduce = require('await-reduce');

The behaviour matches Array.prototype.reduce.

const results = await reduce(
    [
        fetch('one').then(res => res.json()),
        fetch('two').then(res => res.json()),
        fetch('ten').then(res => res.json()),
    ],
    (accumulator, item) => [...accumulator, item],
    []
)

The callback matches Array.prototype.reduce's 4 argument signature, except the 4th argument (array) are the results of the Promises, and the callback itself can be asynchronous as well.

const results = await reduce(
    [
        fetch('one'),
        fetch('two'),
        fetch('ten'),
    ],
    async (accumulator, response, index, array) => {
        if (!response.ok) {
            return accumulator
        }
        const data = await response.json()
        return Object.assign(accumulator, data)
    },
    {}
)

Transpiled version

Environments which exclude node_modules from the transpiling pipeline should include the "browser" entry instead of "main". This exposes an ES5 commonjs module.

Also available for explicit import:

const reduce = require('await-reduce/dist');