2017-04-01 8 views
2

Ngrx Angular 2アプリを作成していて、一定時間が経過してもHTTPコールを取得しようとしていました。私は​​関数の使用を見ましたが、Ngrxの場合、@Effect()の内部でサービスコールが行われると、エラーが発生します。Ngrx Store、Effects、Http Ajax Polling Setup on Angular 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は静的関数なので、Observableプロトタイプに存在しません - あなたのエラーが行われている理由です。

代わりに、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)

これを試してください。

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

動作しません。エラーもありません。 – notANerdDev

関連する問題