2017-04-01 15 views
2

Ngrx Angular 2 앱을 만들고 시간 간격을두고 폴링을 계속하기 위해 http 호출을 받으려고했습니다. interval() 함수를 사용했지만 Ngrx의 경우 서비스 호출이 @Effect() 내부에서 수행되면 오류가 발생합니다. 제발 조언 :Ngrx Store, Effects, Http Ajax 폴링 설정 (각도 2)

@Injectable() 
export class TasksEffects { 
constructor(
    private actions$: Actions, 
    private TS: TaskService 
){} 

@Effect() 
onLoadTasksLoadTasks$: Observable<Action> = this.actions$.ofType(tasksActions.ActionTypes.LOAD_TASKS) 
    .switchMap(() => { 
     return this.TS.index() 
      .map((res) => new tasksActions.LoadTasksSuccessAction(res.json())) 
      .catch(err => of(new tasksActions.LoadTasksFailAction(err))); 
    }); 

10 초마다 switchMap 기능을 실행하고 싶습니다. 이것은 작동하지 않습니다.

@Effect() 
onLoadTasksLoadTasks$: Observable<Action> = this.actions$.ofType(tasksActions.ActionTypes.LOAD_TASKS) 
    .switchMap(() => { 
     return this.TS.index() 
      .map((res) => new tasksActions.LoadTasksSuccessAction(res.json())) 
      .catch(err => of(new tasksActions.LoadTasksFailAction(err))); 
    }).interval(10000); 

타입 오류 : rxjs 5 interval()에서

enter image description here

답변

6

interval은 정적 기능입니다.

대신에 timer을 사용하여 원하는 것을 달성 할 수 있어야합니다. timer

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/of'; 
import 'rxjs/add/observable/timer'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/switchMap'; 

@Effect() 
onLoadTasksLoadTasks$: Observable<Action> = this.actions$ 
    .ofType(tasksActions.ActionTypes.LOAD_TASKS) 
    .switchMap(() => Observable 
    .timer(0, 10000) 
    .switchMap(() => this.TS.index() 
     .map((res) => new tasksActions.LoadTasksSuccessAction(res.json())) 
     .catch(err => Observable.of(new tasksActions.LoadTasksFailAction(err))) 
    ) 
); 

, 그것은 초기 지연을 지정하는 것이 가능하고 여기가되도록 타이머 화재 즉시 제로로 설정합니다. 그 후 10 초마다 실행되지만 다른 LOAD_TASKS 작업이 수신되면 switchMap은 수신 거부되었으며 새로운 timer이 생성되었습니다.

+1

Observable.timer를 정지 또는 취소하는 대상은 무엇입니까? 필요로하는 데이터를받은 후에도 영원히 계속되지 않을까요? –

+0

아무것도 멈추지 않습니다. OP는 투표를 원했습니다. – cartant

0

정적 함수이다. 제작자로만 사용할 수 있습니다 Observable.interval(1).

시도해보십시오. 당신의 오류가 영향을 받는다 이유입니다 - 그것은 Observable 프로토 타입에 존재하지 않는, 그래서 다른 대답에 명시된 바와 같이

this.actions$.ofType(tasksActions.ActionTypes.LOAD_TASKS) 
    .skipUntil(Observable.interval(10000)) 
    .switchMap(res => {...}) 
+0

작동하지 않습니다. 오류도 없습니다. – notANerdDev