取消ngrx效果中的计时器

时间:2017-06-27 17:13:31

标签: angular ngrx ngrx-effects ngrx-store

我有一个微调器我希望微调器在显示之前等待x秒。但是,如果在微调器等待超时完成期间调用REQUEST_DEACTIVATE_SPINNER,则应该停止触发ACTIVATE_SPINNER操作。阿卡我想取消活动计时器。这是我到目前为止所做的。

  @Effect() spinnerActive$ = this.actions$
    .ofType(REQUEST_ACTIVATE_SPINNER, REQUEST_DEACTIVATE_SPINNER)
    .switchMap(action => {
      // create a timer and return it active event sent when timer completes
      if (action.type === REQUEST_ACTIVATE_SPINNER) {
        timer$ = Observable.timer(action.payload.delay || 0)
        .switchMap(() =>
          Observable.of({type: ACTIVATE_SPINNER})
        );
      }

      if (action.type === REQUEST_DEACTIVATE_SPINNER) {
        // check to see if a timer is running if it is cancel it
        if (timer$) {
          // cancel the timer
        }
        return Observable.of({type: DEACTIVATE_SPINNER});
      }
    });

有些机构可能会告诉我们如何取消正在返回效果的计时器。

2 个答案:

答案 0 :(得分:5)

您应该可以使用takeUntil operator解决问题。

当收到switchMap操作时,您可以使用它来完成REQUEST_ACTIVATE_SPINNER REQUEST_DEACTIVATE_SPINNER效果中的observable。

请注意,现在有两种效果,因为REQUEST_DEACTIVATE_SPINNER效果现在独立于REQUEST_ACTIVATE_SPINNER效果:

@Effect() spinnerActive$ = this.actions$
  .ofType(REQUEST_ACTIVATE_SPINNER)
  .switchMap(action => Observable
    .timer(action.payload.delay || 0)
    .takeUntil(this.actions$.ofType(REQUEST_DEACTIVATE_SPINNER))
    .switchMap(() => Observable.of({ type: ACTIVATE_SPINNER })
  );

@Effect() spinnerDeactive$ = this.actions$
  .ofType(REQUEST_DEACTIVATE_SPINNER)
  .switchMap(action => Observable.of({ type: DEACTIVATE_SPINNER }));

此外,部分switchMap运算符是不必要的,可以替换为mapTo

@Effect() spinnerActive$ = this.actions$
  .ofType(REQUEST_ACTIVATE_SPINNER)
  .switchMap(action => Observable
    .timer(action.payload.delay || 0)
    .takeUntil(this.actions$.ofType(REQUEST_DEACTIVATE_SPINNER))
    .mapTo({ type: ACTIVATE_SPINNER })
  );

@Effect() spinnerDeactive$ = this.actions$
  .ofType(REQUEST_DEACTIVATE_SPINNER)
  .mapTo({ type: DEACTIVATE_SPINNER });

答案 1 :(得分:-1)

当您需要手动终止计时器时,请在您的订阅上致电unsubscribe()(抱歉,$timerObservable)。当没有应用订阅时,它会被处理。