2016-02-01 2 views
1

Я пытаюсь опросить REST API для обновления таблицы данных, который работает отлично со следующим кодом:Угловые 2 Http опроса не доставляющие ошибки

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

Проблема заключается в том, что ошибка и полный никогда не дозвонились. Будем очень благодарны за любые предложения по работе с onError и onCompete. Благодаря!

ответ

3

О вызове наблюдателя 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 не будет вызываться.

+0

Ive прочитало немного больше о rxjs, и то, что вы сказали о неполной, в порядке, но я все еще не получаю ошибку, поступающую к моему абоненту. Когда я реализую HTTP без интервала и запускаю HTTP 500, возникает ошибка, но когда он завернут в интервал, он не делает –

+0

Можете ли вы опубликовать оба jsfiddle, чтобы поведение можно было воспроизвести? – user3743222

+0

Я понял, что код, который я разместил, отличается от того, что я тестировал, отсутствует .retry(). 'pollData (url, interval) { return Rx.Observable.interval (interval) .mergeMap (() => this.http.get (url) .retry()); } ' С тех пор я понял, что повторная попытка должна поглощать ошибку, следовательно, причина, по которой абонент не получает ее. Большое спасибо за вашу помощь. –

0

На всякий случай кто-то хотел узнать, как я решил решить эту проблему и реализовал требуемые функции. В основном мне просто нужно было обернуть наблюдаемое в другом и вернуть ошибку в качестве данных.

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