老师,为什么BehaviorSubject的值改不了,在方法中的值已经更改了,在方法外获取的值怎么还是初始化的值,代码如下。

来源:6-6 Observable 的冷和热以及 Subject

慕斯卡11664660

2018-09-02

import { Injectable } from "@angular/core";

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpHeaders } from "@angular/common/http";

import { Observable, throwError, BehaviorSubject } from "rxjs";

import { catchError, filter, take, switchMap } from "rxjs/operators";

import { AuthService } from "./services/auth.service";



@Injectable()

export class ErrorInterceptor implements HttpInterceptor {



private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(

null

);


constructor(private auth: AuthService) {

}




intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

let accToken;

return next.handle(request).pipe(catchError(err => {

if (err["error"]["error"] === "invalid_token") {

this.auth.refreshToken().subscribe(data => {

this.refreshTokenSubject.next(data["access_token"]);

console.log('access_token:'+JSON.stringify(this.refreshTokenSubject['_value']));

})


// add authorization header with jwt token if available

request = request.clone({

setHeaders: {

Authorization: `Bearer ${JSON.stringify(this.refreshTokenSubject['_value'])}`

}

});

return next.handle(request);




}

if (err.status === 401) {

// auto logout if 401 response returned from api


// location.reload(true);

}


const error = err.error.message || err.statusText;

return throwError(error);

}))




}




}



写回答

1回答

接灰的电子产品

2018-09-03

使用 Rx 应该牢记的一点是它是异步的,也就是说你的代码中在你所谓的内部调用了 refershToken 之前,“外部”的语句已经执行了

0
1
慕斯卡11664660
如何获取函数里边的数据
2018-09-05
共1条回复

Angular打造企业级协作平台,让你在Angular领域中出类拔萃

全网首个介绍官方 Material 组件库用法与 Redux 在 Angular 中的应用

998 学习 · 536 问题

查看课程