NGRX: подписаться на наблюдаемый возврат по методу выбора - синхронизация или асинхронность? - PullRequest
0 голосов
/ 10 июня 2019

Я использую NGRX в своем проекте Angular, так как мы знаем, что возвращаемое значение store.select имеет тип Observable. И в одном из моих service я планирую получить значение состояния и использовать это значение в качестве входного параметра запроса API. Следующим образом:

// the userIDs$ is return by store.select method
this.demoService.userIDs$.subscribe((res) => {
  console.log('userids', res); //  output first
})
console.log('after wellids...') //  output after the console in subscription callback
this.http.post<string[]>(
  url, 
  { ids: userids} // the user ids as input parameter
);

Мой вопрос - подписаться на наблюдаемую userIDs, обратный вызов - синхронный или асинхронный? Исходя из моей отладки, первая консоль запускается перед второй (той, которая находится вне подписки). Спасибо

1 Ответ

1 голос
/ 10 июня 2019

В NGRX сам магазин - это просто BehaviorSubject.

Когда новое значение отправляется в BehaviorSubjet, все обратные вызовы будут вызываться на одном и том же тике, поэтому в основном это синхронно . Конечно, если вы применили перед обратным вызовом delay для ex, тогда он стал бы асинхронным.

Тем не менее, я бы не советовал вам использовать магазин таким образом, и я просто переписал бы ваш код следующим образом:

this.demoService.userIDs$.pipe(
  first(),
  tap(userIDs => console.log({ userIDs })),
  mergeMap(userIDs => this.http.post<string[]>(url, { ids: userids }))
);

Таким образом, вам все равно, синхронный он или асинхронный. Вы просто храните весь источник данных в одном потоке.

Это также безопаснее, потому что если при вызове этого потока позже в вашем приложении, у вас будет возможность отменить его (с switchMap).

Также обратите внимание на использование first, потому что в вашем случае вы держите поток userIDs$ открытым (что, я считаю, в этом случае будет утечкой памяти).

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