Ожидание данных в угловом перехватчике с использованием объекта RxJs BehaviorSubject - PullRequest
1 голос
/ 26 июня 2019

Я новичок в rxjs - вроде как понимаю большинство операторов, но не понимаю, как конкретно использовать BehaviorSubject, filter и take.

Я хочу обновить пару oauth-доступа и обновить токен в угловом перехватчике. Весь код, который я видел здесь и в блогах, одинаков - кажется, есть стандартный способ сделать это. Но есть один момент, который я не понимаю.

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

private refreshSubject = new BehaviorSubject<any>(null);

// ...etc.

if (!this.refreshInProgress) {
  // request new access and refresh tokens from server
  // populate refreshSubject once tokens received
}
else {
  return this.refreshSubject.pipe(
    filter(result => result !== null),                      // <---- ???
    take(1),                                                // <---- ???
    switchMap(() => next.handle(this.addToken(request)))
  );
}

Все такие примеры объясняют, что запросы помещаются в очередь до тех пор, пока refreshSubject не заполнятся новыми токенами, и что магия происходит в filter.

Это то, чего я не понимаю. В rxjs docs не говорится, что filter вызывает ожидание - где / как происходит ожидание и организация очереди?

1 Ответ

3 голосов
/ 26 июня 2019

Итак, начальное значение BehaviorSubject - «NULL» (перед выполнением запроса или соединения через сокет для получения нового токена) необходимо выбрать значения, отличные от NULL, для этого мы используем Оператор " filter "

filter(result => result !== null), 

При этом будут отправлены только значения, отличные от NULL, на следующий шаг конвейера BehaviorSubject.

Теперь нам нужно только «взять» один из отправленных значений из BehaviorSubject (вам это нужно из-за способа, которым вы получаете новый токен), чтобы сделать это, мы используем Оператор " take ".

take(1),

Это будет только излучать значение ONE , даже если было 10 выпущенных значений, только первое будет передано на следующий шаг конвейера.

После всего этого вы обрабатываете значения с помощью «switchMap», но помните, что BehaviorSubject выдает текущее значение (последнее выданное значение) каждый раз, когда получает новую подписку.

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