Цепочка HTTP-запроса и возвращаемое обещание не работают - PullRequest
1 голос
/ 16 мая 2019

У меня есть общий сервис для выполнения http-звонков. Первый http-вызов должен получить токен, а с обновленным токеном делается второй запрос. Но пользователь будет вызывать только метод doPost(). И пользователь должен иметь возможность разрешить обещание в компоненте.

public getToken(){
    return this.http.get(<url>);
  }

public doPost(){
       this.getToken().subscribe(token => {
          return this.http.post(<url>,token);
       });
    }

Метод post post не работает. Как вернуть обещание второго вызова после первого вызова успешно.

Ответы [ 3 ]

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

Вам не нужно использовать subscribe дважды, просто используйте pipe:

public getToken(){
  return this.http.get(<url>);
}

public doPost() {
  this.getToken().pipe(
    mergeMap(token => this.http.post(<url>, token))
  )
}

теперь вы сможете получить ответ на метод post: this.doPost.subscribe(res => <do something with the res>);

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

Можно попробовать

import {switchMap} from 'rxjs/operators';

public getToken(){
  return this.http.get(<url>);
}

public doPost(){
  return this.getToken().pipe(switchMap(token => this.http.post(<url>,token)));
}

И вызвать функцию doPost().toPromise(); или doPost().subscribe();

0 голосов
/ 16 мая 2019

Вы должны использовать как наблюдаемую, так и подписаться на нее.Если вы не хотите конкретно обещание, по умолчанию оно является наблюдаемым, и оно должно оставаться таким.Теперь вы ничего не возвращаете из doPost.это должно быть что-то вроде этого:

public getToken(){
    return this.http.get(<url>);
  }

public doPost(){
       var result: Subscription = this.getToken().subscribe(token => {
          return this.http.post(<url>,token);
       });
    }

А затем вы можете разрешить эту подписку и получить еще одну наблюдаемую, если вы этого хотите.

Если вы хотите конкретно пообещать вам "toPromise() "для наблюдаемого результата.

Я бы на вашем месте подписался на наблюдаемое в классе, который вы используете, и присваиваете переменную, которую вы используете внутри этого класса, как только результатвернулся или разрешите i в асинхронном канале в html-части.

Что-то вроде этого должно дать вам подсказку:

public getToken(){
    return this.http.get(<url>);
  }

public doPost(){
       this.getToken().subscribe(token => {
          this.yourvariable = this.http.post(<url>,token);
       });
    }

Или

<div *ngFor="let x in yourVariable | async"></div>
...