Cancellation
可以用 RxJS 的操作符 来完成 :
这里我们将 .takeUntil()
放到.mergeMap()
内部, 并且在 AJAX 调用之后; 这很重要因为我们想要取消的是 AJAX 请求,而不是停止 Epic 监听任何未来的 actions。 像这样隔离 observable 链将是很重要的概念你会经常使用。如果你不是很明白,你应该花点时间尽快的熟悉 RxJS 和 操作符链通常是如何工作的。 Ben Lesh 同时覆盖到了隔离链!
有时候你想不仅仅取消像 AJAX 调用这种副作用,同时还要做一些其他事情,例如发出完全不同的 action。
例如,当某人分发 时我们会执行一个 AJAX 调用,但是如果某人分发 FETCH_USER_CANCELLED
我们会取消 AJAX 请求并且发出一个完全不同的 action 做为代替,在本例中,增加一个计数:
import { ajax } from 'rxjs/observable/dom/ajax';
action$.ofType(FETCH_USER)
.mergeMap(action =>
ajax.getJSON(`/api/users/${action.payload}`)
action$.ofType(FETCH_USER_CANCELLED)
.map(() => incrementCounter())
.take(1)
)
我们同样也要使用 .take(1)
,因为当我们和 AJAX 调用竞赛时只想监听取消 action 一次。