HTTP请求链接和返回诺言不起作用

时间:2019-05-16 11:52:22

标签: angular promise observable

我有一个通用服务可以拨打http。 第一个http调用是获取令牌,并使用更新的令牌发出第二个请求。但是用户只会调用doPost()方法。 用户应该能够在组件中解决诺言。

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

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

post方法返回不起作用。 第一次呼叫成功后如何返回第二次呼叫的承诺。

3 个答案:

答案 0 :(得分:1)

您不必重复使用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 :(得分:1)

您可以尝试

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();

答案 2 :(得分:0)

您应该同时使用观察对象和订阅它。除非您特别想要一个承诺,否则默认情况下它是可观察的,并且应保持这种状态。现在您没有从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>