Ngrx: Возможно ли частично использовать асинхронный канал? - PullRequest
0 голосов
/ 03 января 2019

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

Например,

// ts file
this.name$ = this.store.pipe(
      select(SOME.STATE),
      map((item) => {
        return item.name;
      })
    )

// html file
<p>{{name$ | async}}</p>

Все просто, но что, если мне нужно

// ts file
this.store.pipe(
      select(SOME.STATE),
    )
.subscribe(item => {
  this.name = item.name;
  this.age = item.age // <-
})

someMethod() {
  const age = this.age;
  // ...some processes using 'age' data which from store
}

// html file
<p>{{name}}</p>

Как и выше, если у меня есть несколько данных, и мне нужно выполнить какой-то пост-процесс (например, someMethod()), я не уверен, как обрабатывать асинхронный канал. Больше нет асинхронного канала, что означает, что мне нужно unsubscribe вручную, чтобы получить более подробный код.

Я пробовал ниже

// ts file
this.name$ = this.store.pipe(
      select(SOME.STATE),
      map((item) => {
        return item.name;
      })
    )

this.store.pipe(
      select(SOME.STATE),
    )
.subscribe(item => {
  this.age = item.age
})

someMethod() {
  const age = this.age;
  // ...some processes using 'age' data which from store
}


// html file
<p>{{name$ | async}}</p>

Работаю, но мне интересно, есть ли лучший способ.

Спасибо.

1 Ответ

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

Используйте оператор tap, чтобы сделать это вместо подписки.

this.name$ = this.store.pipe(
    select(SOME.STATE),
    tap(item => this.age = item.age),
    map((item) => {
        return item.name;
    }));

Хотя на самом деле нет никакой причины делать это таким образом. Вместо этого вы должны просто иметь другую наблюдаемую, например age$.

...