Javascript 等待嵌套的承诺解决

Javascript 等待嵌套的承诺解决,javascript,asynchronous,promise,es6-promise,Javascript,Asynchronous,Promise,Es6 Promise,我正在尝试对数据库进行一系列嵌套调用,并希望在结果全部返回后执行一些操作。我对承诺是新手,所以如果我完全做错了,请原谅我(可能是这样) 我的代码目前是这样的: getVideos(user).then((videos) => { videos.forEach((video) => { getImage(video).then(() => { getMembers().then((members) => { getComments()

我正在尝试对数据库进行一系列嵌套调用,并希望在结果全部返回后执行一些操作。我对承诺是新手,所以如果我完全做错了,请原谅我(可能是这样)

我的代码目前是这样的:

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()
,而无需等待

我正试图修改代码,将这些承诺打包成一个大的承诺,这样一旦它解决了,我就可以在一个地方访问所有获取的数据。这是我的尝试,但它打印出来了

承诺{…},承诺{…},承诺{…},承诺{…}

而不是获取的数据

知道我做错了什么吗?知道我怎样才能正确地把这些嵌套的承诺变成一个?谢谢

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)
})
尝试使用两个
承诺。所有
都改为-每个
视频
,一个给
成员
评论
关键字
,和
成绩单

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(),
    ]))
  )
));
承诺链将通过以下方式解决:

[ [
    // video 1
    v1members,
    v1comments,
    v1keywords,
    v1transcript,
  ],
  [
    // video 2
    v2members,
    v2comments,
    v2keywords,
    v2transcript,
  ],
  // ...
]
尝试使用两个
承诺。所有
都改为-每个
视频
,一个给
成员
评论
关键字
,和
成绩单

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(),
    ]))
  )
));
承诺链将通过以下方式解决:

[ [
    // video 1
    v1members,
    v1comments,
    v1keywords,
    v1transcript,
  ],
  [
    // video 2
    v2members,
    v2comments,
    v2keywords,
    v2transcript,
  ],
  // ...
]

如果您
console.log(参数),该怎么办
相反?您需要使用嵌入承诺(
成员
注释
…)解析并根据此状态打印的数据设置全局状态,或者将输出例程移动到
。然后
处理程序处理所述承诺。最终解决方案肯定取决于您需要什么,但我建议你看看。它允许您在继续执行之前等待多个承诺。因此,如果您想同时检索有关特定视频的所有信息,您可以。如果你想等待所有的视频信息返回,你可以这样做。现在还不清楚什么取决于这里的内容
getMembers()
getComments()
getTranscript()
,等等。不要接受任何参数。那么他们总是返回相同的东西吗?在给他们打电话之前,他们是否依赖于发生的任何事情?他们正在读取一个全局变量吗?如果你想序列化你的请求,那么链接你的承诺。回报内心的承诺。搜索“承诺链接”以获取更多信息。但是,您可能不需要序列化它们。您可以发出所有请求并使用
Promise.all()
来了解它们何时全部完成
相反?您需要使用嵌入承诺(
成员
注释
…)解析并根据此状态打印的数据设置全局状态,或者将输出例程移动到
。然后
处理程序处理所述承诺。最终解决方案肯定取决于您需要什么,但我建议你看看。它允许您在继续执行之前等待多个承诺。因此,如果您想同时检索有关特定视频的所有信息,您可以。如果你想等待所有的视频信息返回,你可以这样做。现在还不清楚什么取决于这里的内容
getMembers()
getComments()
getTranscript()
,等等。不要接受任何参数。那么他们总是返回相同的东西吗?在给他们打电话之前,他们是否依赖于发生的任何事情?他们正在读取一个全局变量吗?如果你想序列化你的请求,那么链接你的承诺。回报内心的承诺。搜索“承诺链接”以获取更多信息。但是,您可能不需要序列化它们。您可以发出所有请求并使用
Promise.all()
来知道它们何时全部完成。有人可能会问,为什么
getImage()
不能与
getMembers()
getComments()
等并行,所有这些请求都在同一个
Promise.all()
中,因为它们似乎都不相互依赖。问得好,应该已经澄清:如果没有图像,我将中止查询。无图像=无需获取所有其他图像stuff@EgorEgorov-“无图像”是否意味着
getImage()
拒绝或在解析时必须检查返回值?有人可能会问,为什么
getImage()
不能与
getMembers()
getComments()
等在同一个
Promise.all()中并行
因为它们似乎都不相互依赖。好问题,应该澄清一下:如果没有图像,我将中止查询。无图像=无需获取所有其他图像stuff@EgorEgorov-“无图像”是指
getImage()
拒绝还是在解析时必须检查返回值?