2017-07-31 5 views
0

ローディングインジケーターが遅れて、APIからデータを取得するたびに点滅したりちらついたりしないようにするエフェクトの作成を試しています。これは、画面にそのようなインジケータを投げる前にAPIを300〜500ミリ秒で応答させたい唯一の人にはなり得ないと確信しているため、何を検索するのかわからない場合があります。@ ngrx/effectsでローディングインジケーターディレイを作成する

@Effect() startDelayTimer: Observable<Action> = this.actions$ 
    .ofType(uiActions.START_LOADING_DELAY_TIMER) 
    .switchMap(action => Observable 
     .timer(300) 
     .mapTo(new uiActions.LoadingDelayTimerCompleteAction)); 

この効果が途絶えることはありますか?私はすべてのアクションと状態のペアをコンソールに記録していますが、START_LOADING_DELAY_TIMERは呼び出されていますが、完了は決してありません。

編集

私が持っていた問題は関係のないことになったので、この質問は、時期尚早に頼まれました。

@Effect() startDelayTimer: Observable<Action> = this.actions$ 
    .ofType(uiActions.START_LOADING_DELAY_TIMER) 
    .switchMap(action => Observable 
     .timer(5000) 
     .takeUntil(this.actions$.ofType(uiActions.CANCEL_LOADING_DELAY_TIMER)) 
     .mapTo(new uiActions.LoadingDelayTimerCompleteAction) 
) 
  • スタート(APIからのデータ取得の完了からそう)
  • を点滅ロードインジケータを遅らせるためにタイマーCancelLoadingDelayTimerActionが派遣されている場合:ここでは他のケース誰における最終的な実装は、この質問findsがあります、タイマーを停止し、ローディングインジケーターを表示しないでください。
  • CancelLoadingDelayTimerActionが送信される前にタイマーが完了すると、ローディングインジケータが表示されます。

答えて

1

.timer(300)の代わりに.delay(300)を使用してください。それはあなたの問題を解決するはずです。

タイマーは一定の間隔で数値を出力します。これにより、エフェクトで奇妙な動作が発生する可能性があります。遅れは、単にあなたが求めていると思う所与の時間量の流れを抑制します。

+0

いただきありがとうございます。残念ながら、私の問題は[完全に関係のない問題](https://github.com/ngrx/effects/issues/132)によって引き起こされました – wolfhoundjesse

+0

また、私はObservable.timer()を使用してキャンセルを支援しています。上記のコードからは明らかではないので、これを他の人にとってより有用な質問にするために更新します。 – wolfhoundjesse

関連する問題