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()
拒绝还是在解析时必须检查返回值?