JS Promises: is there an optional way to resolve multiple promises as properties of an object?
I wrote the code below and then realized what it resolved before (registration before all promises resolve):
readDirPromise
.then(categoriseFiles)
.then(({movies, series}) => ({
movies: Promise.all(movies.map(movieTasks)),
series: Promise.all(series.map(seriesTasks))
}))
.then((res) => {
console.log('🦄 done!', res)
})
I was able to rewrite it to resolve it in the correct order:
readDirPromise
.then(categoriseFiles)
.then((cats) => Promise.all(cats.movies.map(movieTasks)).then((movies) => {
cats.movies = movies
return cats
}))
.then((cats) => Promise.all(cats.series.map(seriesTasks)).then((series) => {
cats.series = series
return cats
}))
.then((res) => {
console.log('🦄 done!', res)
})
but I can't help but think ... is there a neater, more extensible way?
+3
source to share
3 answers
You can make the serial step independent of the video step (rather than block one by one) by wrapping both of them on a different layer Promise.all
, returning as a tuple, which you can then destruct and rebuild into the object you want:
readDirPromise
.then(categoriseFiles)
.then(({movies, series}) => Promise.all([
Promise.all(movies.map(movieTasks)),
Promise.all(series.map(seriesTasks))])
.then(([movies, series]) => ({movies, series}))
.then((res) => {
console.log('🦄 done!', res)
})
+4
source to share
For what it's worth, I believe the async / await version would look something like this:
async function generateResponse() {
const {movies, series} = await readDirPromise.then(categoriseFiles);
return {
movies: await Promise.all(movies.map(movieTasks)),
series: await Promise.all(series.map(seriesTasks))
}
}
+2
source to share