将可观察对象传递给订阅者.下一步,避免嵌套



我对rxjs和Observables比较陌生。我试图写一个服务方法,它返回一个可观察对象,当订阅时,将输出HTTP请求的结果。但是,在我发出请求之前,我必须确保存在适当的授权令牌(它并不总是存在)。

这是我想到的完成这项任务的方法:

getDataFromHTTPCall (): Observable<any>  {
return new Observable(subscriber => {
if (this.authorizationToken == null) {
subscriber.error("Authorization Token Required")
} else {
subscriber.next(
from(
axios.get(`${this.baseUrl}/getData}`, { headers: {'Authorization': this.authorizationToken }})
).pipe(
map(result => result.data),
catchError( (err) => {
console.log(err)
return EMPTY
})
)
)
}
})
}

这在技术上是可行的,但它有一些主要问题。最值得注意的是,通过将一个可观察对象传递给另一个可观察对象,它要求该函数的调用者订阅两次。我一直在阅读,观察对象不应该像这样嵌套,我可以看到为什么这是不希望的。

我觉得有更好的方法来完成我在这里想做的事情。有人能建议一个更好的方法来完成这类任务使用可观察对象吗?

这个函数的逻辑听起来像"如果没有存储的凭证,抛出错误,否则返回通过管道输入的axios调用"。翻译成RxJS,它看起来像这样:

getDataFromHTTPCall(): Observable<any> {
return this.authorizationToken == null
? throwError('Authorization Token Required')
: from(
axios.get(`${this.baseUrl}/getData}`, {
headers: {Authorization: this.authorizationToken},
}).pipe(/* etc */)
);
}

如何开始发射this.authorizationToken的值,然后使用concatMap调用http服务或错误,如果this.authorizationToken是空的?

代码看起来像这样

getDataFromHTTPCall() {
return of(this.authorizationToken).pipe(
concatMap(authToken => {
if (authToken == null) {
throw new Error("Authorization Token Required")
}
return from(axios.get(`${this.baseUrl}/getData}`, 
{ headers: {'Authorization': authToken }})
).pipe(
map(result => result.data),
catchError( (err) => {
console.log(err)
return EMPTY
})
)
})
)
}

最新更新