Angular 2 Http 轮询未传递错误
Angular 2 Http polling not delivering errors
我正在尝试轮询 REST API 以更新数据 table,该数据可以正常使用以下代码:
pollData(url, interval) {
return Rx.Observable.interval(interval)
.mergeMap(() => this.http.get(url));
}
// get data
this.dataService.pollData(this.url, this.updateInterval)
.subscribe(
data => console.log(data),
err => console.log(err),
() => console.log('done'));
问题是永远不会调用 error 和 complete。非常感谢任何使它与 onError 和 onCompete 一起工作的建议。谢谢!
关于对观察者的onComplete
调用,它只会在源观察者完成时生效。这意味着 pollData
返回的可观察对象完成时。由于您当前正在轮询而没有退出条件,因此您的可观察对象自然不会完成。
要完成此可观察性,您需要提出退出条件:
- 超时(例如,轮询 X 秒,然后停止轮询)
- 投票数
- 基于 pollData 的条件(例如,如果在 X 次连续轮询后没有检测到变化)
- 外部完成信号
- 对您的用例有意义的任何其他条件
所有这些条件都可以通过 RxJS 轻松实现,因为它们需要您更新 pollData
函数的代码。
例如对于外部完成信号,你可以这样写:
// defining somewhere the subject for signalling end of polling
stopPollingS = new Rx.Subject();
// somehow pass this subject as a parameter of the polling function
pollData(url, interval, stopPollingS) {
return Rx.Observable
.interval(interval)
.mergeMap(() => this.http.get(url))
.takeUntil(stopPollingS);
}
// somewhere in your code when you want to stop polling
stopPollingS.onNext(true);
关于对观察者的 onError
调用,我不确定我是否了解发生了什么。您是否尝试过引发错误并检查确实调用了观察者的 onError
处理程序?如果没有错误,很明显onError
不会被调用。
以防万一有人想知道我是如何解决这个问题并实现所需功能的。基本上我只需要将 observable 包装在另一个中并且 return 错误作为数据。
initiatePolling(url, interval) {
var http = this.http;
return Rx.Observable.create(function (observer) {
// initial request (no delay)
requestData();
var timerId = setInterval(requestData, interval);
function requestData() {
var subscription = http.get(url).timeout(20000)
.subscribe(
result => {
observer.next(result);
subscription.unsubscribe();
},
err => {
observer.next(err);
subscription.unsubscribe();
},
() => {
subscription.unsubscribe();
});
}
return function () {
observer.complete();
window.clearInterval(timerId);
}
});
}
我正在尝试轮询 REST API 以更新数据 table,该数据可以正常使用以下代码:
pollData(url, interval) {
return Rx.Observable.interval(interval)
.mergeMap(() => this.http.get(url));
}
// get data
this.dataService.pollData(this.url, this.updateInterval)
.subscribe(
data => console.log(data),
err => console.log(err),
() => console.log('done'));
问题是永远不会调用 error 和 complete。非常感谢任何使它与 onError 和 onCompete 一起工作的建议。谢谢!
关于对观察者的onComplete
调用,它只会在源观察者完成时生效。这意味着 pollData
返回的可观察对象完成时。由于您当前正在轮询而没有退出条件,因此您的可观察对象自然不会完成。
要完成此可观察性,您需要提出退出条件:
- 超时(例如,轮询 X 秒,然后停止轮询)
- 投票数
- 基于 pollData 的条件(例如,如果在 X 次连续轮询后没有检测到变化)
- 外部完成信号
- 对您的用例有意义的任何其他条件
所有这些条件都可以通过 RxJS 轻松实现,因为它们需要您更新 pollData
函数的代码。
例如对于外部完成信号,你可以这样写:
// defining somewhere the subject for signalling end of polling
stopPollingS = new Rx.Subject();
// somehow pass this subject as a parameter of the polling function
pollData(url, interval, stopPollingS) {
return Rx.Observable
.interval(interval)
.mergeMap(() => this.http.get(url))
.takeUntil(stopPollingS);
}
// somewhere in your code when you want to stop polling
stopPollingS.onNext(true);
关于对观察者的 onError
调用,我不确定我是否了解发生了什么。您是否尝试过引发错误并检查确实调用了观察者的 onError
处理程序?如果没有错误,很明显onError
不会被调用。
以防万一有人想知道我是如何解决这个问题并实现所需功能的。基本上我只需要将 observable 包装在另一个中并且 return 错误作为数据。
initiatePolling(url, interval) {
var http = this.http;
return Rx.Observable.create(function (observer) {
// initial request (no delay)
requestData();
var timerId = setInterval(requestData, interval);
function requestData() {
var subscription = http.get(url).timeout(20000)
.subscribe(
result => {
observer.next(result);
subscription.unsubscribe();
},
err => {
observer.next(err);
subscription.unsubscribe();
},
() => {
subscription.unsubscribe();
});
}
return function () {
observer.complete();
window.clearInterval(timerId);
}
});
}