将 observable 传递给 subscriber.next 并避免嵌套
Passing observable to subscriber.next and avoid nesting
我对 rxjs 和 Observables 比较陌生。我正在尝试编写一种服务方法,该方法 returns 是一个可观察对象,在订阅时将输出 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
})
)
)
}
})
}
这在技术上可行,但存在一些重大问题。最值得注意的是,通过将一个可观察对象传递给另一个可观察对象,它需要此函数的调用者订阅两次。我一直在读到 observables 永远不应该像这样嵌套,我明白为什么不希望这样。
我觉得有更好的方法来完成我在这里尝试做的事情。有人可以建议使用 observables 完成此类任务的更好方法吗?
如何从发出 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
})
)
})
)
}
该函数的逻辑听起来像“如果您没有存储凭据,则抛出错误,否则 return 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 */)
);
}
我对 rxjs 和 Observables 比较陌生。我正在尝试编写一种服务方法,该方法 returns 是一个可观察对象,在订阅时将输出 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
})
)
)
}
})
}
这在技术上可行,但存在一些重大问题。最值得注意的是,通过将一个可观察对象传递给另一个可观察对象,它需要此函数的调用者订阅两次。我一直在读到 observables 永远不应该像这样嵌套,我明白为什么不希望这样。
我觉得有更好的方法来完成我在这里尝试做的事情。有人可以建议使用 observables 完成此类任务的更好方法吗?
如何从发出 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
})
)
})
)
}
该函数的逻辑听起来像“如果您没有存储凭据,则抛出错误,否则 return 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 */)
);
}