我正在开发一个用于从Jira提取数据的工具。我可以找到很多示例,这些示例链接了多个http调用,以使用上一个调用中的数据进行一个接一个的调用。但是我偶然发现的是如何等待所有内部调用解析并处理数据,然后再等待解析外部。
这里正在发生的事情是,方法this.developmentService.getData(this.filter)不会等待内部this.developmentService.getStoriesForEpic(epic.key)中每个史诗的故事计数完成),这是有问题的,因为在此之后,我需要根据这些计数应用其他过滤器。
updateChart() {
this.loading = true;
if (this.dataRequest) { this.dataRequest.unsubscribe(); }
this.developmentService.getData(this.filter).toPromise().then(initiatives => {
initiatives.map((initiative) => {
initiative.devEpics.map((epic) => {
return this.developmentService.getStoriesForEpic(epic.key).toPromise().then(stories => {
Promise.all(stories.map((story) => {
if (story.status == "To Do") {
epic.storiesToDo++;
}
else if (story.status == "In Progress") {
epic.storiesInProgress++;
}
else if (story.status == "Done") {
epic.storiesDone++;
}
}))
})
})
})
this.data=initiatives;
})
我尝试了多种方法,但似乎无法达到目标。任何帮助表示赞赏!预先感谢
答案 0 :(得分:0)
不要将它们转换为Promise,而要使用RXJS。
forkJoin
或combineLatest
-取决于您的预期行为。
https://rxjs-dev.firebaseapp.com/api/index/function/combineLatest
https://rxjs-dev.firebaseapp.com/api/index/function/forkJoin
答案 1 :(得分:0)
您可以尝试这样
async updateChart() {
this.loading = true;
if (this.dataRequest) { this.dataRequest.unsubscribe(); }
this.developmentService.getData(this.filter).toPromise().then(initiatives => {
initiatives.map((initiative) => {
initiative.devEpics.map((epic) => {
let dataFromGetStoriesForEpic = await getStoriesForEpic(epic);
})
})
})
this.data=initiatives;
})
我们在这里为getStoriesForEpic创建一个函数
getStoriesForEpic(epic) {
return promise = new Promise ((resolve, reject) => {
this.developmentService.getStoriesForEpic(epic.key).toPromise().then(stories => {
Promise.all(stories.map((story) => {
if (story.status == "To Do") {
epic.storiesToDo++;
}
else if (story.status == "In Progress") {
epic.storiesInProgress++;
}
else if (story.status == "Done") {
epic.storiesDone++;
}
resolve(epic);
}))
})
}