JS Promises:有没有一种巧妙的方法来解决多个promises作为对象属性?

时间:2017-03-29 11:14:10

标签: javascript es6-promise

我写了下面的代码,然后意识到它正在尽早解决(在所有承诺解决之前记录):

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)
})

但我不禁想到......是否有更整洁,更具伸展性的方式?

3 个答案:

答案 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); 
});