Как получить машинописный код http.get, чтобы можно было наблюдать, пока параметр не будет возвращен inline? - PullRequest
0 голосов
/ 21 мая 2019

Хорошо, поэтому я пытаюсь получить вызов http.get, который я выполняю, чтобы дождаться возврата одного из параметров (getUserToken), прежде чем вызывать функцию http.get. Я не хочу связывать их здесь вместе, потому что моя вызывающая функция getSomeData возвращает наблюдаемую, которая затем вызывается множеством других функций.

getSomeData - это тот, для которого нужно вернуть getUserToken, но getUserToken всегда имеет значение null, потому что я не выполняю обещание правильно. Извините, я просто не вижу решения здесь.

эта функция запускает вызов, есть много функций, которые делают этот вызов, я не хочу ничего менять здесь.

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

Это вызов, который возвращает http.get, проблема здесь в getUserToken. Мне нужен http.get для ожидания getUserToken ().

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

Проблема в том, что getUserToken делает свой собственный вызов серверу, есть ли способ обернуть это в наблюдаемое или обещание, которое можно вызывать и разрешать внутри строки http.get внутри вызова getSomeData?

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


1 Ответ

1 голос
/ 21 мая 2019

Этого можно добиться, используя 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...