RxJS Подождите, пока все наблюдаемые не закончатся данными первого вызова - PullRequest
0 голосов
/ 12 февраля 2019

Мне нужно получить данные из службы.Затем мне нужно перебрать данные и извлечь данные с идентификаторами, полученными при первом вызове.

Моя цель - оптимизировать производительность угловых привязок, вызывая markForCheck () для ChangeDetectorRef при загрузке всех данных.

Это мой текущий код.Это сделать работу.Но вызов markForCheck () выполняется до загрузки всех данных.

 this.subs.push(
  this.supplierService
    .supplier(this.supplierId)
    .pipe(
      tap(supplier => {
        this.subs.push(
          of(supplier.employees.map(emp => emp.authId))
            .pipe(
              mergeMap(ids => ids.map(id => this.authRegisterService.lookupId(id))),
              mergeMap(res => res)
            )
            .subscribe(
              result => {
                this.authRegs.push(result);
              },
              error => {
                this.toastr.error(error);
                return EMPTY;
              }
            )
        );
      }),
      tap(supplier => {
        this.subs.push(this.cvrService.getCompany(supplier.cvr).subscribe(cvr => (this.cvr = cvr)));
      }),
      tap(supplier => {
        this.subs.push(
          of(supplier.locations.map(loc => loc.sorId))
            .pipe(
              mergeMap(ids => ids.map(id => this.sorService.getLocation(id))),
              mergeMap(res => res)
            )
            .subscribe(sor => {
              this.sors.push(sor);
            })
        );
      })
    )
    .subscribe(supplier => {
      this.supplier = supplier;
      this.supplierStatusLabel = SupplierStatusNames.get(supplier.status);
      this.cd.markForCheck();
    })
);

Я прочитал документацию для forkJoin , но не знаю, как объединить ее с первым вызовом,Все входные данные очень ценны.

1 Ответ

0 голосов
/ 13 февраля 2019

Вам не нужен forkJoin, вам нужен mergeMap или concatMap, forkJoin обычно плох, почему ?, потому что если один запрос завершается неудачно, то все остальное терпит неудачу.

mergeMap и concatMap, если один из десяти запросовнапример, происходит сбой, остальные девять продолжают пытаться завершить.

Разница между mergeMap и concatMap заключается в том, как они выполняют запросы, в mergeMap они отправляются на сервер «одним нажатием», я имею в виду, позволяетЕсли вы хотите получить 10 дат, mergeMap затем выполняет запрос для 10 дат, не дожидаясь окончания предыдущей, пока concatMap ожидает завершения предыдущей, чтобы добавить новый запрос в очередь.

Здесь выУ меня есть пример "как использовать concatMap, mergeMap и forkJoin": https://angular -bojdob.stackblitz.io

Я написал средний пост, но на испанском, но естьочень хороший средний пост об этом тоже: Вот он на испанском (мой): https://medium.com/@asfo/usando-concatmap-mergemap-y-forkjoin-en-angular-para-peticiones-http-c70f65df54af

Вот это от Томаса (английский): https://blog.angularindepth.com/practical-rxjs-in-the-wild-requests-with-concatmap-vs-mergemap-vs-forkjoin-11e5b2efe293

...