Cancellation

    可以用 RxJS 的操作符 来完成 :

    这里我们将 .takeUntil() 放到.mergeMap()内部, 并且在 AJAX 调用之后; 这很重要因为我们想要取消的是 AJAX 请求,而不是停止 Epic 监听任何未来的 actions。 像这样隔离 observable 链将是很重要的概念你会经常使用。如果你不是很明白,你应该花点时间尽快的熟悉 RxJS 和 操作符链通常是如何工作的。 Ben Lesh 同时覆盖到了隔离链!


    View this demo on JSBin

    有时候你想不仅仅取消像 AJAX 调用这种副作用,同时还要做一些其他事情,例如发出完全不同的 action。

    例如,当某人分发 时我们会执行一个 AJAX 调用,但是如果某人分发 FETCH_USER_CANCELLED 我们会取消 AJAX 请求并且发出一个完全不同的 action 做为代替,在本例中,增加一个计数:

    1. import { ajax } from 'rxjs/observable/dom/ajax';
    2. action$.ofType(FETCH_USER)
    3. .mergeMap(action =>
    4. ajax.getJSON(`/api/users/${action.payload}`)
    5. action$.ofType(FETCH_USER_CANCELLED)
    6. .map(() => incrementCounter())
    7. .take(1)
    8. )

    我们同样也要使用 .take(1),因为当我们和 AJAX 调用竞赛时只想监听取消 action 一次。