あなたには、いくつかの他のアクションを実行する必要がある場合は、トークンが利用可能になったとき、あなたが次の操作を行うことができます。
getToken() {
return this.http.post('myAuthEndpoint', { credentials })
.map((res) => {
const token = res.headers.get('Authorization')
return token;
})
.do((token) => {
localStorage.setItem('id_token', token);
});
}
// some other part of app
authService.getToken()
.switchMap((token) => {
// perform any desired action
})
.subscribe((result) => ...);
をしかし、この場合には、その後のsubscribe
なしgetToken()
を呼び出すと、何もしないことを注意してください。あなたは2つのサービス1を持っているコメント
へ
回答は、トークン、他方がそれを消費提供:
export class AuthService {
private tokenSource = new ReplaySubject(1);
private token$ = this.tokenSource.asObservable();
constructor(private http: Http) {
return this.http.post('myAuthEndpoint', { credentials })
.map((res) => {
let token = res.headers.get('Authorization')
return token;
})
.do((token) => {
localStorage.setItem('id_token', token);
})
.subscribe(this.tokenSource);
}
getToken() {
return this.token$;
}
}
export class RecentPhotosService {
constructor(private authService: AuthService) {
this.authService.getToken()
.switchMap(token => {
return this.getRecentPhotos(token);
})
.subscribe(photos => {...});
}
...
}
いや、それは観測(およびそれらの前に約束)の全体のポイントです。コールが終了したときに返す値は必ずしも使用可能ではありません。 – jonrsharpe
getToken()でトークンをリファクタリングして返す方法はありますか? – user1354934
いいえ、ありません。トークンを取得するプロセスは非同期です。代わりに、観測可能なものを返すか(またはそれを約束に変換する)、それを返し、*呼び出し元にそれをサブスクライブさせるべきです。同様の問題を抱えた他の人に私のアドバイスを見てください:http://stackoverflow.com/questions/41271214/how-to-get-a-global-http-get-request-for-use-everywhere?noredirect=1#comment69743655_41271214 – jonrsharpe