Angular + RxJS: сделать несколько звонков с сервера в flatMap и получить их в подписке - PullRequest
0 голосов
/ 10 мая 2018

Ниже приведен фрагмент кода моей проблемы.

this.locationService.getUserLocation()
    .flatMap(location => {
        // Some code
        return this.searchService.getResults(location); // returns an observable
    })
    .flatMap(searchResponse => {
        // some code  
        // NEED ANOTHER CALL with searchResponse.  --- (A)
        return this.resultsService.getCount(searchResponse.results); --- (B)
    })
    .subscribe(count => {
        console.log(count);
    });

Теперь мне нужно сделать еще один вызов во втором блоке flatMap. Как я могу справиться с этим?

Если я делаю несколько звонков, как я могу подписаться на несколько результатов и получить данные в подписке?

P.S: Вызовы A и B могут выполняться параллельно. Им просто нужно searchResponse в качестве ввода.

1 Ответ

0 голосов
/ 10 мая 2018

Вы можете использовать Observable.forkJoin, который будет выполнять вызовы параллельно и возвращаться после завершения всех внутренних наблюдаемых:

this.locationService.getUserLocation()
    .flatMap(location => {
        // Some code
        return this.searchService.getResults(location); // returns an observable
    })
    .flatMap(searchResponse => {
        return Observable.forkJoin(
          this.resultsService.getCount(searchResponse.results),
          Observable.of(searchResponse) // replace with second call here
        );
    })
    .subscribe(([count, results]) => { // forkJoin returns array of results
        console.log(count, results);
    });

Подробнее об операторе forkJoin: Документы


ОБНОВЛЕНИЕ

Как заметил @ChauTran в комментариях, если ваш один или несколько наблюдаемых не завершены (или вам нужно получитьрезультаты, прежде чем они будут завершены), тогда вы можете использовать Observable.combineLatest ( Документы ).

Этот оператор возвращается, как только каждая из внутренних наблюдаемых генерирует по крайней мере один раз .Вот пример с combineLatest:

this.locationService.getUserLocation()
    //...
    .flatMap(searchResponse => {
        return Observable.combineLatest(
          this.resultsService.getCount(searchResponse.results),
          Observable.of(searchResponse) // replace with second call here
        );
    })
    .subscribe(([count, results]) => { // forkJoin returns array of results
        console.log(count, results);
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...