Angular7 服务 - 返回包含来自另一个可观察对象的数据但订阅组件内的第二个可观察对象的可观察对象?
Angular7 service - returning observable that contains the data from another observable but subscribing to that second Observable within component?
我的服务中有一个功能,returns 一个 Observable(http 请求)需要使用特殊令牌来形成。所以 - 在能够获得此功能之前,我需要检索令牌才能发出请求。
我一直在寻找链接这些请求的方法或检索该令牌以确保在发出该请求之前它就在那里,但是因为它是在构造函数中完成的,所以当您第一次加载页面时令牌不存在,HTTP 请求失败。
我目前在我的服务中有一个 if 块,如下所示:
if (!this.activeDirectoryToken) {
this.adalService
.acquireToken('https://graph.windows.net')
.subscribe(token => {
this.activeDirectoryToken = token;
// RETURN OBS LOGIC OF THE SECOND HTTP REQUEST USING THE TOKEN
});
} else {
// RETURN OBS LOGIC OF THE SECOND HTTP REQUEST USING THE TOKEN
但是,当然,如果我尝试订阅该函数并且 if 块触发,它会抛出一个错误,因为 'subscribe' 将不存在于该类型上。
我还将令牌存储在 redux 存储中,并在服务的构造函数中订阅它,我还有另一个 if 块在那里发出请求,以防它是 null/false。
尽管如此,由于没有设置令牌,第一个请求仍然失败。
第一种方法return是令牌。如果它已经被缓存,那么只需 return 当前令牌,否则获取一个新令牌并缓存它。
之后您可以使用 switchMap
为您的第二部分做 http 请求并订阅。
getToken(): Observable<string> {
if (this.activeDirectoryToken)
return Observable.of(this.activeDirectoryToken);
return this.adalService
.acquireToken('https://graph.windows.net')
.pipe(
do(token => this.activeDirectoryToken = token)
);
}
secondPart(){
this.getToken().pipe(
switchMap( token => SECOND HTTP REQUEST USING THE TOKEN)
)
.subscribe(...);
}
注:未测试
我的服务中有一个功能,returns 一个 Observable(http 请求)需要使用特殊令牌来形成。所以 - 在能够获得此功能之前,我需要检索令牌才能发出请求。
我一直在寻找链接这些请求的方法或检索该令牌以确保在发出该请求之前它就在那里,但是因为它是在构造函数中完成的,所以当您第一次加载页面时令牌不存在,HTTP 请求失败。
我目前在我的服务中有一个 if 块,如下所示:
if (!this.activeDirectoryToken) {
this.adalService
.acquireToken('https://graph.windows.net')
.subscribe(token => {
this.activeDirectoryToken = token;
// RETURN OBS LOGIC OF THE SECOND HTTP REQUEST USING THE TOKEN
});
} else {
// RETURN OBS LOGIC OF THE SECOND HTTP REQUEST USING THE TOKEN
但是,当然,如果我尝试订阅该函数并且 if 块触发,它会抛出一个错误,因为 'subscribe' 将不存在于该类型上。
我还将令牌存储在 redux 存储中,并在服务的构造函数中订阅它,我还有另一个 if 块在那里发出请求,以防它是 null/false。
尽管如此,由于没有设置令牌,第一个请求仍然失败。
第一种方法return是令牌。如果它已经被缓存,那么只需 return 当前令牌,否则获取一个新令牌并缓存它。
之后您可以使用 switchMap
为您的第二部分做 http 请求并订阅。
getToken(): Observable<string> {
if (this.activeDirectoryToken)
return Observable.of(this.activeDirectoryToken);
return this.adalService
.acquireToken('https://graph.windows.net')
.pipe(
do(token => this.activeDirectoryToken = token)
);
}
secondPart(){
this.getToken().pipe(
switchMap( token => SECOND HTTP REQUEST USING THE TOKEN)
)
.subscribe(...);
}
注:未测试