我正在尝试对数据库进行一堆嵌套调用,并希望在结果全部恢复后再执行一些操作。我是新来的诺言,如果我完全做错了(可能是这种情况),请原谅我
我的代码当前是这样的:
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)
})
答案 0 :(得分:6)
尝试使用两个 Promise.all
-每个video
一个,另一个members
,comments
,{{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(),
]))
)
));