等到嵌套的诺言解决

时间:2018-07-25 23:53:08

标签: javascript asynchronous promise es6-promise

我正在尝试对数据库进行一堆嵌套调用,并希望在结果全部恢复后再执行一些操作。我是新来的诺言,如果我完全做错了(可能是这种情况),请原谅我

我的代码当前是这样的:

getVideos(user).then((videos) => {
  videos.forEach((video) => {
    getImage(video).then(() => {
      getMembers().then((members) => {
        getComments().then((comments) => {
          getKeywords().then((keywords) => {
            getTranscript().then((transcript) => {
              console.log(members, comments, keywords, transcript)
            }
          }
        }
      }
    })
  })
})

这显然是超级低效的,因为getMembers()getComments()getKeywords()getTranscript()不需要彼此等待,都可以异步调用。此外,循环中的每个视频都可以异步调用getImage(),而无需等待。

我正在尝试更改代码以将这些承诺捆绑为一个大的承诺,因此一旦解决,我就可以在一个地方访问所有提取的数据。这是我的尝试,但可以打印

  

Promise {...},Promise {...},Promise {...},Promise {...}

代替获取的数据。

有什么主意我在做错什么,如何正确地将所有这些嵌套的诺言变成一个?谢谢

let members, comments, keywords, transcript

getVideos(user).then((videos) => {
   let promises = []
   videos.forEach((video) => {
      let p = getImage(video).then(() => {
        members = getMembers()
        comments = getComments()
        keywords = getKeywords()
        transcript = getTranscript()
        return Promise.all([members, comments, keywords, transcript])
      })
      promises.push(p)
  })
  return Promise.all(promises)
})
.then(() => {
  console.log(members, comments, keywords, transcript)
})

1 个答案:

答案 0 :(得分:6)

尝试使用两个 Promise.all-每个video一个,另一个memberscomments,{{1} }和keywords

transcript

然后,promise链将通过类似的方式解决

getVideos(user).then((videos) => Promise.all(
  videos.map(video => getImage(video)
    .then(videoResp => Promise.all([
      getMembers(), // do you need to call these functions with `videoResp`?
      getComments(),
      getKeywords(),
      getTranscript(),
    ]))
  )
));