如何等待直到所有数据加载到Angular 2异步相关的HTTP调用中?

时间:2019-06-03 12:52:54

标签: node.js angular typescript promise observable

我正在开发一个用于从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;
})

我尝试了多种方法,但似乎无法达到目标。任何帮助表示赞赏!预先感谢

2 个答案:

答案 0 :(得分:0)

不要将它们转换为Promise,而要使用RXJS。

forkJoincombineLatest-取决于您的预期行为。

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);
      }))
  })   
}