Дождитесь окончания последней подписки - PullRequest
0 голосов
/ 13 марта 2019

У меня есть следующие настройки:

    let result = service.getResults();

    result.data.forEach((row:any) => {
          this.myService
            .getObject(row.id)
            .subscribe((object:any) => {
              //...
            })
        );
      }

Я хочу сделать что-то, после того как все подписки на getObject(row.id) закончены.Я знаю, что есть функция add(), но она будет делать это для каждой подписки.Исходя из Promises я бы сохранил каждое Promise, а затем в массиве и просто вызвал Promise.all ().

Ответы [ 2 ]

4 голосов
/ 13 марта 2019

Я хочу сделать что-нибудь, после того как все подписки getObject (row.id) закончены.

Лучше использовать forkJoin для вашего примера. Из официальных документов:

forkJoin будет ожидать завершения всех переданных Observables, а затем отправит массив с последними значениями из соответствующих Observables.

Попробуйте сделать это следующим образом:

import { forkJoin } from 'rxjs';

const rowObjects$ = result.data.map(rd => this.myService.getObject(rd.id));

forkJoin(rowObjects$)
  .subscribe((object:any) => {
    //...
  })
0 голосов
/ 13 марта 2019

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

import {combineLatest} from 'rxjs';
...



let result = service.getResults();

const observablesToCombine = [];

result.data.forEach((row:any) => {
      observablesToCombine.push(this.myService.getObject(row.id));
})

combineLatest(observablesToCombine).subscribe((object: Array<any>) => {
     //...
})
...