我知道我无法给出BehaviorSubjectObservable 值,但我需要一种方法来解决这个问题。在应用程序初始化时,我正在获取当前用户(如果存在),并且我需要给出该BehaviorSubject潜在值。所以我的服务代码如下所示:
private user = new BehaviorSubject<User>(this.getUser());
public user$ = this.user.asObservable();
getUser(): User {
// does obviously not work!
return this.apiService.getUser()
.map(data => {
if(data) {
return data;
}
// do something else
})
}
Run Code Online (Sandbox Code Playgroud)
那么是否有一些神奇的 rxjs 运算符可以解决这个问题,或者其他一些可能性?
提前致谢!
我无法使用data()DocumentSnapshot上的属性。它在控制台中给我一个错误。这是确切的错误:
auth.service.ts(72,20):错误TS2339:类型为“可观察”的属性“数据”不存在。
我尝试以多种不同方式获取数据。所有这些技术都是错误。
服务:
constructor(
private afAuth: AngularFireAuth,
private afs: AngularFirestore,
private router: Router,
public db: AngularFirestore
) {
this.user = afAuth.authState;
this.user.subscribe((user) => {
if (user) {
this.userDetails = user;
console.log(this.userDetails);
} else {
this.userDetails = null;
}
})
}
getUserName() {
(this.isLoggedIn()){
const userD = this.db.collection('users').doc(this.userDetails.uid);
const doc = userD.get();
return doc.data().firstName;
} else {
console.log('user not logged in');
return "nothing";
}
}
Run Code Online (Sandbox Code Playgroud) 我遵循这个例子:https://www.intertech.com/Blog/angular-4-tutorial-handling-refresh-token-with-new-httpinterceptor/
一切都很好,除了方法handle401Error.除非我添加subscribe了拦截器,否则它不会执行.我必须错过一些东西,即使试图遵循这个例子.
这是相关的代码:
零件:
ngOnInit() {
this.service.getData()
.subscribe((response: any) => {
this.message = `Worked with status = ${response.status}`;
},
error => this.message = `Failed with status = ${error.status}`);
}
Run Code Online (Sandbox Code Playgroud)
服务:
constructor(private http: HttpClient) {
this.currentToken = this.authTokenStale;
}
public authTokenStale: string = 'stale_auth_token';
public authTokenNew: string = 'new_auth_token';
public currentToken: string;
getData() {
return this.http.get<{status}>('https://private-4002d-testerrorresponses.apiary-mock.com/getDataError401');
}
getAuthToken() {
return this.currentToken;
}
refreshToken(): Observable<string> {
this.currentToken = this.authTokenNew;
return Observable.of(this.authTokenNew).delay(200);
}
Run Code Online (Sandbox Code Playgroud)
拦截器:
isRefreshingToken: boolean …Run Code Online (Sandbox Code Playgroud)