如何让 typescript http.get observable 等待参数内联返回?

How to get typescript http.get observable to wait for parameter to be returned inline?

好的,所以我正在尝试进行 http.get 调用,以等待参数之一 (getUserToken) 在调用 http.get 函数之前返回。我不想在这里将它们链接在一起,因为我的调用函数 getSomeData returns 是一个可观察对象,然后由许多其他函数调用。

getSomeData 是需要返回 getUserToken 的数据,但 getUserToken 始终为空,因为我没有正确执行承诺。抱歉,我在这里没有看到解决方案。

这个函数开始调用,有很多函数进行这个调用,我不想在这里改变任何东西。

displayData(){
 let mySubscription = this.getSomeData();
    mySubscription.subscribe(retJson => {
      if (retJson != null && retJson !== undefined){
        console.log(retJson);
      }
    });
}

这是调用,returnshttp.get问题出在getUserToken这里。我需要 http.get 来等待 getUserToken()。

getSomeData(){
     let temporary = this.http.get(serviceUrl, getUserToken() ).map((response: Response) => {
       return response;
  });
return temporary;
}

问题是 getUserToken 对服务器进行了自己的调用,有没有办法将其包装在可以在 getSomeData 调用内 http.get 内联调用和解析的可观察对象或承诺中?

getUserToken(){
     this.authenticationService.getToken()
            .subscribe(responseData => {
              if (responseData){
                let headers = new Headers({ 'Authorization': 'Bearer ' + responseData.token });
                return new RequestOptions({ headers: headers });
              }
            });
}


您可以使用 switchMap 来实现。

@Injectable()
class SomeClass {
   // Constructor omitted

   public displayData():void {
      const subscription:Subscription = this.getSomeData()
         .filter(retJson => !!retJson) // Only if json is truthy
         .subscribe(console.log);
   }

   // Get the user token, then switch to the actual data
   private getSomeData():Observable<any /*Replace with correct data type*/ > {
      return this.getUserToken() // get the user token
         .switchMap(userToken => // This is the token -> switchMap basically subscribes to the getUserToken and returns another observable
            this.http.get(serviceUrl, // switch to another observable as soon as getUserToken gives a value
               new RequestOptions({headers: new Headers({...userToken})}) // optionally, add other headers here
            )
         );
   }

   private getUserToken():Observable<{authorization: string}> {
      return this.authenticationService.getToken()
        .filter(responseData => !!responseData) // only if responseData is truthy
        .map(responseData => ({'Authorization': `Bearer ${responseData.token}`})); // Map to the object representing the header header
   }

}

或者,为了让流更明显,你可以在一个方法中这样写(不推荐,只是为了让流更明显):

const subscription:Subscription = this.authenticationService.getToken()
   .filter(responseData => !!responseData) // only if responseData is truthy
   .switchMap(userToken => // This is the token -> switchMap basically subscribes to the getUserToken and returns another observable
        this.http.get(serviceUrl, // switch to another observable as soon as getUserToken gives a value
           new RequestOptions({headers: new Headers({'Authorization': `Bearer ${responseData.token}`})}) // optionally, add other headers here
        )
    )
    .filter(retJson => !!retJson) // Only if json is truthy
    .subscribe(console.log);