Наблюдаемый или асинхронный / ожидающий для селекторов NGRX? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть магазин ngrx, и я вызываю селектор на ngOnInit (см. Код ниже). Кто-то сказал, что я должен поместить этот вызов в async / await, так как я жду только одного значения. Я не уверен, что это правильный путь, потому что наблюдаемая вызывает свою функцию complete (), когда выполняется emit, и, поскольку есть только одно значение, она немедленно вызовет complete (). У кого-то есть другое мнение или лучший подход? спасибо.

ngOnInit(){
    this.store.pipe(select(selectSomeString), takeUntil(this.destroy$)).subscribe(
          (someString) => this.checkIfValid(someString)
        );
}

private checkIfValid(someString: string){
//some code
}

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

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

В этом случае я бы порекомендовал вам использовать оператор take после оператора select и до оператора takeUntil.

this.store.pipe(
  select(selectSomeString), 
  takeUntil(this.destroy$))
.subscribe((someString) => 
  this.checkIfValid(someString)
);

Использование take(1) будет убедитесь, что вы берете 1-е излучаемое значение. Подробнее об операторе вы можете прочитать здесь .

1 голос
/ 10 апреля 2020

Необходимость только одного значения не является причиной для включения селекторов в async/await.

NgRx по своей природе реактивен и интенсивно использует Rx JS. Rx JS предоставляет достаточно операторов, чтобы ограничить количество событий, которые вы принимаете (например, take(1)). В вашем случае, если источник испускает только одно значение, нет никаких причин использовать какие-либо дополнительные операторы.

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

Только не забудьте отписаться от подписки, иначе это может привести к утечке памяти.

...