2017-02-13 3 views
0

У меня есть приложение, где у меня есть функция get(), которая возвращает меня Observable.interval(1000) с http GET.Angular2 - GET 400 отключить мою наблюдаемую.подписку с интервалом

В app.component я подписываю это Observable и печатаю на экране некоторые значения из GET.

Everythings отлично работает до тех пор, пока ответ получения ответа не будет 400 - сервер посылает 404 время от времени - обычно. Но когда я получаю 400, моя подписка перестает работать. экран показывает только последний valuse и остановить "освежающий"

Вот код:

getAct(symbol:string): Observable<Act> { 

return Observable 
    .interval(1000) 
    .flatMap(() => { 
    return this.http.get(url) 
     .map((res: Response):Act => (res.json())) 
     .catch(err => { 
     return Observable.throw(err); 
     }); 
    }); 

}

А вот код, который подписываются:

this.actSub = this.actService 
    .getAct(this.symbol) 
    .subscribe(
    act => { 
     console.log("ok"); 
     this.act = act;    
     } 
    }, 
    err => {console.warn(err);}, 
    ()=>console.log("Done") 
); 

Итак, если я запустите мое приложение на консоли. У меня есть следующее: enter image description here

Итак, программа работает нормально - 29 получить успех, но когда он восстанавливает 400 своих остановок и там, где больше нет «хорошо».

Где проблема? Является ли мой getAct() неправильным, или, может быть, когда я подписываюсь, я что-то неправильно делаю?

Пожалуйста, помогите, я попытался восстановить это, но я не мог.

+0

Это нормальное поведение. Наблюдаемые прекращают выдавать значение после завершения или ошибок (как в случае с ответом 4 ** HTTP). – AngularChef

ответ

1

Существует несколько операторов RxJS для обработки ошибок.

Проще было бы использовать retry():

return this.http.get(url) 
    .retry() 
    .map(res => res.json()); 

Это агрессивна стратегия, как он будет вновь подписаться на оригинал наблюдаемых (this.http.get(...)) как только запрос терпит неудачу. Вы могли бы на самом деле сильно ударить по серверу.

Вы можете хотите использовать retryWhen() вместо этого, который позволит вам ввести небольшую задержку перед повтором, например .:

return this.http.get(url) 
    .retryWhen(errors => errors.delay(2000)) // 2-second delay before retrying 
    .map(res => res.json()); 
+0

теперь это работает exatcly, я хочу. Благодаря! –

+0

Добро пожаловать, Мацей. :) – AngularChef

0

Я могу сделать что-то подобное, но я думаю, что это действительно плохое решение.

get(){ 
     this.actSub = this.actService 
      .getAct(this.symbol) 
      .subscribe(
      act => { 
       console.log("ok"); 
       this.act = act;    
       } 
      }, 
      err => { 
       console.warn(err); 
       this.get(); 
      }, 
      ()=>console.log("Done") 
     ); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^