2017-04-01 37 views
2

我正在創建一個Ngrx Angular 2應用程序,並試圖讓我的http調用在一段時間間隔後繼續輪詢。我已經看到使用​​函數,但是在Ngrx的情況下,當服務調用在@Effect()內完成時,它會發生錯誤。請告知:Ngrx Store,Effects,Http Ajax輪詢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); 

類型的錯誤是:

enter image description here

回答

6

正如在其他的答案說,interval是靜態函數,因此它不會對Observable原型存在 - 這就是爲什麼你的錯誤影響。

相反,你應該能夠使用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))) 
    ) 
); 

隨着timer,它可以指定一個初始延遲,在這裏它使立即定時器觸發設置爲零。之後,它會每隔十秒觸發一次,但是如果收到另一個LOAD_TASKS操作,則switchMap將看到它取消訂閱,並創建新的timer等。

+1

什麼停止或取消訂閱Observable.timer?即使在收到需要的數據之後,這難道不會永遠持續嗎? –

+0

沒有什麼能阻止它。 OP想要投票。 – cartant

0

在rxjs 5 interval()是靜態函數。您只能將其用作創作者Observable.interval(1)

試試這個。

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

不起作用。沒有錯誤。 – notANerdDev