我写了下面的代码,然后意识到它正在尽早解决(在所有承诺解决之前记录):
readDirPromise
.then(categoriseFiles)
.then(({movies, series}) => ({
movies: Promise.all(movies.map(movieTasks)),
series: Promise.all(series.map(seriesTasks))
}))
.then((res) => {
console.log(' done!', res)
})
我设法重写它以正确的顺序解决:
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)
})
但我不禁想到......是否有更整洁,更具伸展性的方式?
答案 0 :(得分:4)
你可以让系列步骤独立于电影步骤运行(而不是一个接一个地阻塞),将它们包装在另一层Promise.all
中,然后作为一个元组返回,然后你可以解构它重组为您想要的对象:
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)
})
答案 1 :(得分:2)
对于它的价值,我相信async / await版本会是这样的:
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 :(得分:0)
您可以创建单独的承诺,而不是链接承诺,并在Promise.all
方法中解决它们。
var p1 = getNewPromise();
var p2 = getNewPromise();
var p3 = getNewPromise();
//来自MDN
Promise.all([p1, p2, p3]).then(values => {
console.log(values);
});