Angular7服务-返回包含来自另一个可观察对象的数据但包含该组件中第二个可观察对象的数据的可观察对象?

时间:2018-12-11 14:29:54

标签: angular rxjs angular7 angular-observable

我的服务中有一个函数,该函数返回一个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存储中,并在服务的构造函数中对其进行订阅,并且如果有null / false,则在那里还有另一个if块来请求它。

尽管如此,由于未设置令牌,因此第一个请求仍然失败。

1 个答案:

答案 0 :(得分:0)

第一个方法返回令牌。如果已被缓存,则只需返回当前令牌,否则获取一个新令牌并将其缓存。

之后,您可以使用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(...);
}

注意:未经测试