Как ждать rxjs Observable без изменения всего кода на обещания - PullRequest
0 голосов
/ 11 января 2019

Можно ли ждать наблюдаемого rxjs, не переходя в Обещания? Я делаю 6 запросов OnInit (), однако некоторые запросы заканчиваются раньше других, порядок имеет значение. Можно ли ждать наблюдаемого в typecrypt? Все функции выглядят одинаково, они просто делают разные запросы к серверу. Спасибо за помощь :) Вот мой код:

Мне удалось добиться этого путем объединения запроса (вызов следующего запроса после получения ответа от предыдущего, однако это решение было неэффективным и выглядело некрасиво)

 ngOnInit() {
      this.userId = this.auth.getUserId();

      this.getTrendingRentals();
      this.getFollowingRentals();
      ...
      this.getLuxuryRentals();
      //console.log(this.totalRentals);
    }

    private getTrendingRentals() {
        const rentalObservable = this.rentalService.getRentals();
        //Subscribe to service observer
        rentalObservable.subscribe((rentals: Rental[]) => {
          this.trendingRentals = rentals;
          this.totalRentals.push(this.trendingRentals);
        }, (err) => {
        }, () => {
      });
    }


    public getLuxuryRentals(): Observable<any>{
      return this.http.get('/api/v1/rentals/luxury');
    }

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Методы, которые извлекают данные, не должны возвращать подписки, а должны возвращать наблюдаемые,

private getTrendingRentals() {
    return this.rentalService.getRentals();
}

rxjs предоставляет несколько функций для решения этой проблемы. Взгляните на функции: merge, mergeMap, switchMap, concatMap.

Например:

this.auth.getUserId().pipe(
      mergeMap(userId => this.getTrendingRentals()),
      mergeMap(trendingRentals => this.getFollowingRentals()),
      mergeMap(followingRentals => this.getFollowingRentals()),
      mergeMap(luxuryRentals => this.getLuxuryRentals())
).subscribe(...)

или

this.auth.getUserId().pipe(
      mergeMap(userId => this.getTrendingRentals()),
      mergeMap(trendingRentals => merge(this.getFollowingRentals(), this.getFollowingRentals(), this.getLuxuryRentals()))
).subscribe(...)

Зависимость от ваших конкретных потребностей.

Обновление: @jcal решение с concat выглядит лучше:)

0 голосов
/ 11 января 2019

Вы можете использовать switchMap в трубе, чтобы использовать результат первой наблюдаемой в последующей наблюдаемой.

of("Hello").pipe(
            switchMap(result => of(result + ", World")),
            switchMap(result => of(result + "!")),
          )
          .subscribe(console.log);
// output: Hello, World!

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

concat(
  of(1).pipe(delay(2000)),
  of(2).pipe(delay(500)),
  of(3).pipe(delay(1000))
)
.subscribe(console.log);

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