等到嵌套的promises解决

Ego*_*rov 1 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)
            }
          }
        }
      }
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

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

我正在尝试更改代码以将这些promises捆绑成一个大的,所以一旦它解析,我可以在一个地方访问所有获取的数据.这是我的尝试,但它打印出来

承诺{...},承诺{...},承诺{...},承诺{...}

而不是获取的数据.

知道我做错了什么以及如何将所有这些嵌套的承诺正确地改为一个?谢谢

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)
})
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 6

尝试使用2个 Promise.all!而非-每个video,以及一个用于members,comments,keywords,和transcript:

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(),
    ]))
  )
));
Run Code Online (Sandbox Code Playgroud)

承诺链将以类似的方式解决

[ [
    // video 1
    v1members,
    v1comments,
    v1keywords,
    v1transcript,
  ],
  [
    // video 2
    v2members,
    v2comments,
    v2keywords,
    v2transcript,
  ],
  // ...
]
Run Code Online (Sandbox Code Playgroud)