Как дождаться загрузки всех данных в асинхронных зависимых http-вызовах Angular 2? - PullRequest
0 голосов
/ 03 июня 2019

Я работаю над инструментом, который занимается извлечением данных из 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 голосов
/ 03 июня 2019

Вы можете попробовать вот так

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);
      }))
  })   
}
0 голосов
/ 03 июня 2019

Не превращайте их в обещания, а используйте RXJS.

forkJoin или combineLatest - зависит от вашего ожидаемого поведения.

https://rxjs -dev.firebaseapp.com / апи / индекс / функция / combineLatest

https://rxjs -dev.firebaseapp.com / апи / индекс / функция / forkJoin

...