Я новичок в TypeScript (или даже JavaScript) и Angular 6. Мне нужно извлечь наблюдаемое значение, передать его в HttpClient.post
и обработать ответ.
Почему-то я не могу сделать это правильно. Следующее не компилируется, так как return здесь Observable<Observable<string>>
. Но как мне это правильно?
refreshTokenCall: Observable<string> = null;
refreshToken(): Observable<string> {
if (!this.refreshTokenCall) {
// Here is the error: Type 'Observable<Observable<string>>' is not assignable to type 'Observable<string>'.
// Type 'Observable<string>' is not assignable to type 'string'. [2322]
this.refreshTokenCall = this.getToken().pipe(
map(token => {
console.log("try refresh")
return this.http.post<Token>(AuthService.REFRESH_TOKEN_URL, JSON.stringify({token: token})).pipe(
map(data => data.token),
shareReplay(),
tap(token => {
console.log("save token after refresh");
this.saveToken(token);
}),
finalize(() => this.refreshTokenCall = null)
);
})
);
} // if
return this.refreshTokenCall;
Я пытался поместить вторую карту map(data => data.token)
в первую pipe
, но затем аргумент data
имеет тип Observable<Token>
. По крайней мере, синтаксически работает замена первого map
на switchMap
. Тогда я думаю, что у меня проблемы с документацией о switchMap
switchMap прекращает испускать элементы из ранее выпущенного внутреннего Observable и начинает испускать элементы из нового.
Я надеюсь, что условие if
перехватывает все последующие вызовы. Но как-то мой наблюдаемый конвейер не обрабатывается. Записи журнала не отображаются.
Так что я тут не так делаю?