Сцепление наблюдаемых угловых 5 / Rxjs - PullRequest
0 голосов
/ 15 мая 2018

Я немного запутался с операторами rxjs.У меня есть несколько вызовов API, которые возвращают наблюдаемые:

getCurrentUser(): Observable<any> {
    return this.http.get<any>(userUrl);
  }

tagsList(): Observable<string[]> {
    return this.http.get<string[]>(tagsUrl);
  }

timezonesList(): Observable<Timezone[]> {
    return this.http.get<Timezone[]>(timezonesUrl);
  }

Я хочу позвонить getCurrentUser() затем с результатом возврата значения действия вызова LoadUser(user) Затем после загрузки пользователем вызовите несколько асинхронных запросов одновременно:

tagsList(), timezonesList()

А потом с результатами возврата значения из них вызвать действия LoadTags(tags), LoadTimezones(timezones)

Так должно выглядеть примерно так:

init() {
  this.accountsApi.getCurrentUser()
      .map((user: User) => this.store.dispatch(new LoadUser({ user })))
      .map(
        this.commonApi.tagsList(),
        this.commonApi.timezonesList(),
        this.commonApi.authoriztionServicesList()
      )
      .map((tags, timezones, authorizationServices) => {
        this.store.dispatch(new tagsActions.LoadTags(tags));
        this.store.dispatch(new timezonesActions.LoadTimezones(timezones));
        this.store.dispatch(new authorizationServicesActions.LoadAuthorizationServices(authorizationServices));
      });
}

Я знаю, что этооператоры не правы.Какие операторы я должен использовать для этого?Я уже сделал это с обещаниями, но я уверен, что я могу сделать это с операторами rxjs в меньшей строке кода.

PS Также мне интересно, как я могу сделать это с помощью async / await?Спасибо

1 Ответ

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

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

init() {
  return this.accountsApi.getCurrentUser()
      .do((user: User) => this.store.dispatch(new LoadUser({ user })))
      .forkJoin(
        this.commonApi.tagsList(),
        this.commonApi.timezonesList(),
        this.commonApi.authoriztionServicesList()
      )
      .do((results) => {
        this.store.dispatch(new tagsActions.LoadTags(results[0]));
        this.store.dispatch(new timezonesActions.LoadTimezones(results[1]));
        this.store.dispatch(new authorizationServicesActions.LoadAuthorizationServices(results[2]));
      });
}

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

Оператор do вводит побочные эффекты для запуска действий вашего магазина, поскольку вы не хотите создавать массивы.

...