我是rxjs的新手-我有点了解大多数运算符,但是我不了解BehaviorSubject
,filter
和take
的特定用法。
我想在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
会导致等待-等待和排队发生在何处/如何发生?
答案 0 :(得分:3)
好吧,BehaviorSubject的初始值为“ NULL”(在进行获取新令牌的请求或套接字连接之前),您需要选择与NULL不同的值,为此,我们使用“ filter”运算符
filter(result => result !== null),
这只会将与NULL不同的值发出到BehaviorSubject的下一个管道步骤中。
现在,我们只需要从BehaviorSubject中“获取” 一个发射值(由于您获取新令牌的方式,您必须这样做),为此我们使用“ take”运算符。
take(1),
这将仅发出一个值,即使发出的值有10个,也仅将第一个值传送到下一个管道步骤。
毕竟,您可以使用“ switchMap”处理这些值,但请记住,每当它获得新的订阅时,BehaviorSubject都会发出当前值(最后发出的值)。