使用takeUntil完成RxJS流

时间:2017-01-28 22:02:33

标签: javascript rxjs system.reactive redux-observable

我想使用takeUntil运算符完成一个自然无法完成的内部流,如下所示:

  outerObservable
    .mergeMap(() => {
        innerObservable
            .takeUntil(stopObservable$)
    });

这样可行,内部流按预期完成,但我希望外部流在停止信号之后返回最后一个值。即使经过大量的谷歌搜索,我仍然不知道如何。

编辑:

我已经编写了一个似乎可以解决这个问题的运算符,但是问题仍然存在,因为我知道有一种更好的方法或者我完全误解的东西。

function takeUntilThen(notifier, oneLastValue) {
    return Rx.Observable.create(subscriber => {
        var source = this;
        notifier.subscribe(() => {
            subscriber.next(oneLastValue);
            subscriber.complete()
        });
        return source.subscribe(value => {
            subscriber.next(value);
        },
        err => subscriber.error(err),
        () => subscriber.complete());
    });
}

1 个答案:

答案 0 :(得分:4)

听起来你想在innerObservablestopObservable之间比赛,无论哪个获胜,都应该输出某些东西

您可以使用名称恰当的.race()运算符,而不是使用.takeUntil()。请参阅关于取消的redux-observable docs recipe中的示例:

https://redux-observable.js.org/docs/recipes/Cancellation.html#cancel-and-do-something-else-eg-emit-a-different-action

const somethingEpic = action$ =>
  action$.ofType(SOMETHING)
    .mergeMap(action =>
      innerObservable
        .race(
          stopObservable
            .take(1)
        )
    );

由于你的例子是伪代码,所以这里更具体:

import { ajax } from 'rxjs/observable/dom/ajax';

const fetchUserEpic = action$ =>
  action$.ofType(FETCH_USER)
    .mergeMap(action =>
      ajax.getJSON(`/api/users/${action.payload}`)
        .map(response => fetchUserFulfilled(response))
        .race(
          action$.ofType(FETCH_USER_CANCELLED)
            .map(() => incrementCounter())
            .take(1)
        )
    );