Estoy creando una aplicación Ngrx Angular 2 y estaba intentando que mis llamadas http siguieran sondeando después de un intervalo de tiempo. He visto el uso de la función interval() , pero en el caso de Ngrx, cuando las llamadas de servicio se realizan dentro @Effect() , da un error. Por favor avise:
@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))); });Quiero ejecutar la función switchMap cada diez segundos. Esto no funciona.
@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);El tipo de error es:
Como se indica en la otra respuesta, el interval es una función estática, por lo que no existe en el prototipo Observable , razón por la cual se produce su error.
En cambio, deberías poder lograr lo que quieres usando 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))) ) ); Con el timer , es posible especificar un retraso inicial y aquí se establece en cero para que el temporizador se active inmediatamente. Después de eso, se disparará cada diez segundos, pero si se recibe otra acción LOAD_TASKS , switchMap verá que se canceló la suscripción y se creó un nuevo timer , etc.
En rxjs 5 interval() es una función estática. Solo puede usarlo como creador Observable.interval(1) .
Prueba esto.
this.actions$.ofType(tasksActions.ActionTypes.LOAD_TASKS) .skipUntil(Observable.interval(10000)) .switchMap(res => {...})