О вызове наблюдателя onComplete
, он будет выполняться только тогда, когда источник, наблюдаемый, заканчивается. Это означает, когда наблюдаемый возвращается pollData
. Поскольку вы в настоящий момент опросите без условия выхода, то, естественно, ваш наблюдаемый никогда не завершается.
Чтобы это наблюдаемую завершена, вы должны прийти с условием выхода:
- таймаута (например, опрос на Х секунд, а затем остановить опрос)
- количество опросов
- 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
не будет вызываться.
Ive прочитало немного больше о rxjs, и то, что вы сказали о неполной, в порядке, но я все еще не получаю ошибку, поступающую к моему абоненту. Когда я реализую HTTP без интервала и запускаю HTTP 500, возникает ошибка, но когда он завернут в интервал, он не делает –
Можете ли вы опубликовать оба jsfiddle, чтобы поведение можно было воспроизвести? – user3743222
Я понял, что код, который я разместил, отличается от того, что я тестировал, отсутствует .retry(). 'pollData (url, interval) { return Rx.Observable.interval (interval) .mergeMap (() => this.http.get (url) .retry()); } ' С тех пор я понял, что повторная попытка должна поглощать ошибку, следовательно, причина, по которой абонент не получает ее. Большое спасибо за вашу помощь. –