角拦截器401刷新令牌

时间:2018-12-12 16:04:51

标签: angular rxjs angular-http-interceptors refresh-token

好吧,这应该很容易解决,但是由于该应用程序以前的设计方式,因此要复杂一些。我发现的大多数答案都无法解决我要解决的问题。

从本质上讲,我拦截了API调用,当存在401时,我想获取一个新令牌。此应用程序的设计方式是,我可以调用一个异步操作,以启动API调用来获取新令牌。然后,将该令牌保存在localStorage中。商店中有一个标记,用于跟踪此过程的进度。因此,现在我必须听听可观察对象,并在观察完成后从localStorage中获取新令牌,然后再次进行呼叫。

类似这样的东西:

this.initRefreshFlag$.subscribe((val, i) => {
    if (val === InitFlagType.Done) {
        const newRequest = request.clone({
            setHeaders: {
                'Authorization':
                `${localStorage.getItem(TOKEN_TYPE)} ${localStorage.getItem(ACCESS_TOKEN_KEY)}`
            }
        });
        return next.handle(newRequest);
    }
});

但是,next.handle()不会触发。我现在了解到,由于可能发生内存泄漏,因此我不想在这里使用订阅。我尝试使用switchMapmergeMap,但是当可观察到的this.initRefreshFlag$更改时,它们不会触发。

在不重构动作/史诗中的一堆东西的情况下,我迷失了前进的最佳方法。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我很困惑Array{Int64,1}[[1], [2]] switchMap无法解决的问题,但实际上您无法从mergeMap返回任何信息。

通常,如果您想执行一个Observable,然后将其值用于其他Observable的继续,则可以使用subscribe()

mergeMap