/ / Ngrx Store, efekty, Http Ajax Polling Setup na Angular 2 - kątowe, ngrx, ajax-polling, ngrx-effects

Ngrx Store, Effects, Http Ajax Polling Setup na Angular 2 - kątowe, ngrx, ajax-polling, ngrx-effects

Tworzę aplikację Ngrx Angular 2 i próbowałem uzyskać moje połączenia http, aby kontynuować polling po upływie pewnego czasu. interval() funkcja, ale w przypadku Ngrx, gdy wywołania serwisowe są wykonywane wewnątrz @Effect(), daje błąd. Proszę doradź:

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

Chcę uruchomić funkcję switchMap co dziesięć sekund. To nie działa.

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

Błąd typu to:

wprowadź opis obrazu tutaj

Odpowiedzi:

8 dla odpowiedzi № 1

Jak stwierdzono w drugiej odpowiedzi, interval jest funkcją statyczną, więc nie istnieje na Observable prototyp - dlatego Twój błąd został popełniony.

Zamiast tego powinieneś być w stanie osiągnąć to, czego chcesz używać 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)))
)
);

Z timer, możliwe jest określenie opóźnienia początkowego i tutaj jest ustawiona na zero, tak aby timer uruchamiał się natychmiast. Potem będzie strzelał co dziesięć sekund, ale jeśli inny LOAD_TASKS akcja została odebrana, switchMap zobaczycie to bez subskrypcji i nowe timer stworzony, itp.


0 dla odpowiedzi nr 2

W rxjs 5 interval() jest funkcją statyczną. Możesz używać go tylko jako twórcy Observable.interval(1).

Spróbuj tego.

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