【问题标题】:HTTP request chaining and returning promise not workingHTTP请求链接和返回承诺不起作用
【发布时间】:2019-05-16 20:06:01
【问题描述】:
我有一个通用的服务来进行 http 调用。
第一个 http 调用是获取令牌,并使用更新的令牌发出第二个请求。但用户只会调用doPost() 方法。
并且用户应该能够在组件中解决它的承诺。
public getToken(){
return this.http.get(<url>);
}
public doPost(){
this.getToken().subscribe(token => {
return this.http.post(<url>,token);
});
}
post 方法返回不起作用。
第一次调用成功后如何返回第二次调用的promise。
【问题讨论】:
标签:
angular
promise
observable
【解决方案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>);
【解决方案2】:
你可以试试
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();
【解决方案3】:
您应该使用 observable 并订阅它。除非您特别想要一个承诺,否则默认情况下它是一个可观察的并且应该保持这种状态。现在你没有从 doPost 返回任何东西。它应该是这样的:
public getToken(){
return this.http.get(<url>);
}
public doPost(){
var result: Subscription = this.getToken().subscribe(token => {
return this.http.post(<url>,token);
});
}
然后你可以解决这个订阅,如果你想要这样的话,你可以取回另一个 observable。
如果你想要一个特别的承诺,你可以在可观察的结果上“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>