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:
Odpowiedzi:
8 dla odpowiedzi № 1Jak 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 => {...})