Javascript Angular 2 Http轮询未传递错误

Javascript Angular 2 Http轮询未传递错误,javascript,angular,rxjs,angular2-http,Javascript,Angular,Rxjs,Angular2 Http,我正在尝试轮询REST API以更新数据表,该数据表使用以下代码运行良好: pollData(url, interval) { return Rx.Observable.interval(interval) .mergeMap(() => this.http.get(url)); } // get data this.dataService.pollData(this.url, this.updateInterval) .subscribe(

我正在尝试轮询REST API以更新数据表,该数据表使用以下代码运行良好:

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
返回的可观测数据完成时。由于您当前在没有退出条件的情况下进行轮询,那么您的observable自然永远不会完成

要完成此可观察,您需要提出一个退出条件:

  • 超时(例如,轮询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
将不会被调用。

关于对观察者的
onComplete
调用,它将仅在源可观测完成时生效。这意味着
pollData
返回的可观测数据完成时。由于您当前在没有退出条件的情况下进行轮询,那么您的observable自然永远不会完成

要完成此可观察,您需要提出一个退出条件:

  • 超时(例如,轮询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

以防有人想知道我是如何解决这个问题并实现所需功能的。基本上,我只需要将可观测数据包装成另一个,并将错误作为数据返回

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

以防有人想知道我是如何解决这个问题并实现所需功能的。基本上,我只需要将可观测数据包装成另一个,并将错误作为数据返回

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

我读了更多关于rxjs的书,你说的oncomplete很好,但是我仍然没有把错误告诉我的订户。当我在不使用interval的情况下实现http并触发http 500时,会出现错误,但当它在interval中包装时,不会出现错误。您可以发布两个JSFIDLE,以便可以复制该行为吗?我意识到,我发布的代码与我测试的代码不同,因此丢失了。retry()
pollData(url,interval){return Rx.Observable.interval(interval).mergeMap(()=>this.http.get(url.retry());}
i我开始理解重试必须使用错误,因此订阅者没有收到它的原因。不过非常感谢你的帮助。我读了更多关于rxjs的书,你说的oncomplete很好,但是我仍然没有把错误传达给我的订阅者。当我在不使用interval的情况下实现http并触发http 500时,会出现错误,但当它在interval中包装时,不会出现错误。您可以发布两个JSFIDLE,以便可以复制该行为吗?我意识到,我发布的代码与我测试的代码不同,因此丢失了。retry()
pollData(url,interval){return Rx.Observable.interval(interval).mergeMap(()=>this.http.get(url.retry());}
i我开始理解重试必须使用错误,因此订阅者没有收到它的原因。不过非常感谢你的帮助。好吧,我算出了
var x=this.initiatePolling(…)
然后
x.subscribe((数据)=>{…})
我不是100%理解代码,但我对RxJS是新手,我能说的是,它做了我想要的,如果我能投2倍的话。谢谢如果能将这个答案细化到包含initiatePollingok的用法,那就太好了。我想出来了,
var x=this.InitiatePoll(…)
然后
x.subscribe((数据)=>{…})
我不是100%理解那个代码,但我对RxJS是新手,我能说,它做了我想要的,如果我能投2倍的话。谢谢将这个答案细化到包含initiatePolling的用法会很好