我有一个微调器我希望微调器在显示之前等待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});
}
});
有些机构可能会告诉我们如何取消正在返回效果的计时器。
答案 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()
(抱歉,$timer
为Observable
)。当没有应用订阅时,它会被处理。