Обработка http ответа один за другим в Angular 6 - PullRequest
0 голосов
/ 24 октября 2018

На самом деле у меня есть 15 HTTP-запросов, которые отправляются в API.Все, что я хочу сделать, это обработать ответы один за другим без ожидания завершения всех запросов (у меня есть запрос, который может занять несколько минут для отправки результата).

Сервисная сторона:

    findOneByOne(): Observable<any> {
    const calls = this.getCardsPath().map(el => this.getPromises(el));
    return Observable.forkJoin(calls)
        .map(res => {
            const tab = [];
            for (let i = 0; i < res.length; i++) {
                tab.push(this.checkInfoService(res[i].json()));
            }
            return tab;
        });
}


getPromises(str: String): Promise<any> {
    return this.requester.obtain({
        restUrl: "/administration/" + str,
        method: RequestMethod.Get
    })
        .toPromise()
        .then(res => res)
        .catch(err => err);
}

Сторона компонента:

    displayDashboardInfoService() {
    if (this.featuresFlag.getCurrentVersion() !== "1.08" && this.featuresFlag.getCurrentVersion() !== "-1") {
        this.busy = this.dashboardInfoService.findAll()
            .then((res: DashboardInfo[]) => this.findPaths(res))
            .then((res: DashboardInfo[]) => this.loadItems(res))
            .catch((err: any) => {
                if (environment.debugLevel >= 3) console.error(err);
            });
    }
    else {

        this.dashboardInfoService.findOneByOne()
            .subscribe((res) => {
                const tab = [];
                for (let i = 0; i < res.length; i++) {
                    tab.push(res[i][0]);
                }
                this.findPaths(tab);
                this.loadItems(tab);
            });
    }

}

Спасибо:)

1 Ответ

0 голосов
/ 24 октября 2018

Решением было бы изменить forkJoin на merge, чтобы вместо получения одного события после выполнения всех запросов вы получали событие после завершения каждого из них.

Если вы 'например:

waitForAll() {
  this.values = [];
  this.loadAllAtOnce([100, 200, 300, 400, 3000])
    .subscribe(values => {
      this.values = values;
    });
}

loadAllAtOnce(values: number[]) {
  return forkJoin(
    values.map(x => of (x).pipe(delay(x)))
  ).pipe(
    tap(values => {
      console.log(values);

    })
  );
}

Можно переписать так:

asTheyCome() {
  this.values = [];
  this.loadAsSoonAsAvailable([100, 200, 300, 400, 3000])
    .subscribe(value => {
      this.values.push(value);
    });
}

loadAsSoonAsAvailable(values: number[]) {
  return merge(
    ...values.map(x => of (x).pipe(delay(x)))
  ).pipe(
    tap(value => console.log(value))
  );
}

Рабочий пример можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...