我尝试使用angularfire2身份验证库中的令牌验证我的后端调用。我订阅了authState以获取用户令牌,并将其作为RequestOption添加到我的http请求中。
如果我在chrome调试器中设置断点,它会成功执行getAuthOptions()中的返回行,但在this.getAuthOptions()。toPromise()之后,app既不会调用.then()也不会调用.catch()函数。
Observable用法是否有错误?我可以尝试其他方法吗?
getPoints(): Promise<Object[]> {
return this.getAuthOptions().toPromise()
.then(options => this.http.get(this.baseUrl, options).toPromise())
.then(_ => _.json().data)
.catch(console.log);
}
getPointsFor(isin: String): Promise<Object> {
return this.getAuthOptions().toPromise()
.then(options => this.http.get(this.baseUrl + isin, options).toPromise())
.then(_ => _.json().data[0])
.catch(console.log);
}
private getAuthOptions(): Observable<RequestOptions> {
return this.afAuth.authState.map(res => {
if (res && res.uid) {
const token = res.getIdToken(true);
return new RequestOptions({
headers: new Headers({
Auth: `${token}`
})
});
} else {
return new RequestOptions();
}
});
}
答案 0 :(得分:5)
当{obonable}完成或出错时,toPromise
运算符返回的promise将解析。 AngularFire2 authState
observable未完成,因此除非发生错误,否则承诺将无法解决。
您可以使用take
运算符组成一个observable,它接受第一个发出的身份验证状态,然后完成:
import "rxjs/add/operator/take";
private getAuthOptions(): Observable<RequestOptions> {
return this.afAuth.authState
.take(1)
.map(res => {
if (res && res.uid) {
const token = res.getIdToken(true);
return new RequestOptions({
headers: new Headers({
Auth: `${token}`
})
});
} else {
return new RequestOptions();
}
});
}