我是Angular的初学者,这个问题可能很愚蠢或重复,对不起。
我的目标是只要response.Done!= true就向Web API发送请求,这是我在onInit事件中从服务调用函数的代码:
export class FlightListComponent implements OnInit {
flightSearchResult: FlightSearchResult;
constructor(private service: FlightService) {
}
ngOnInit() {
let guid = Guid.newGuid();
this.service.getAll(guid).subscribe(response => {
if (response.Done != true) {
this.serveData(response);
// this.service.getAll(guid) ....
}
});
}
在每个请求中我还得到一些数据,我需要通过serveData()将它们合并到一个主变量中。但我认为在这种情况下应该有更好的方法来处理observable,只要Done不等于true,我需要多次调用getAll()并且事件在最后给我所有数据而不在每个请求中合并。一些如何将每个传递的Observable的值合并为一个Observable。
有没有解决方案?
答案 0 :(得分:1)
这应该有效:
ngOnInit() {
let guid = Guid.newGuid();
this.getAll(guid);
}
getAll(guid: Guid) {
this.service.getAll(guid).subscribe(response => {
if (response.Done != true) {
this.serveData(response);
this.getAll(guid);
}
});
}
真的不知道这背后的逻辑,但你可能应该去掉嵌套调用,因为你可能会重载你正在调用的API。
答案 1 :(得分:1)
RXJS有repeatWhen()
方法。您可以尝试使用它。请参阅文档:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-repeatWhen
用法示例:http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/
答案 2 :(得分:0)
我认为你正在寻找重试逻辑,样本在下面 -
ngOnInit(){
let guid = Guid.newGuid();
this.service.getAll(guid).subscribe(response => {
if (response.Done != true) {
retryWaitTime = 10;
retryCount = 2;
counter++;
if (counter < retryCount) {
$timeout(function () {
this.serveData(response);
// this.service.getAll(guid) ....
, retryWaitTime);
} else {
counter = 0;
//return error response
}
}
});