使用RxJs BehaviorSubject

时间:2019-06-26 13:17:52

标签: angular typescript rxjs

我是rxjs的新手-我有点了解大多数运算符,但是我不了解BehaviorSubjectfiltertake的特定用法。

我想在Angular拦截器中更新oauth访问并刷新令牌对。我在这里和博客中看到的所有代码都是相同的-似乎有一种标准的方法。但是有一点我不理解。

an example一样,这部分将请求排队,直到有新的访问和刷新令牌可用为止。

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 个答案:

答案 0 :(得分:3)

好吧,BehaviorSubject的初始值为“ NULL”(在进行获取新令牌的请求或套接字连接之前),您需要选择与NULL不同的值,为此,我们使用“ filter”运算符

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

这只会将与NULL不同的值发出到BehaviorSubject的下一个管道步骤中。

现在,我们只需要从BehaviorSubject中“获取” 一个发射值(由于您获取新令牌的方式,您必须这样做),为此我们使用“ take”运算符。

take(1),

这将仅发出一个值,即使发出的值有10个,也仅将第一个值传送到下一个管道步骤。

毕竟,您可以使用“ switchMap”处理这些值,但请记住,每当它获得新的订阅时,BehaviorSubject都会发出当前值(最后发出的值)。