我想使用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());
});
}
答案 0 :(得分:4)
听起来你想在innerObservable
和stopObservable
之间比赛,无论哪个获胜,都应该输出某些东西。
您可以使用名称恰当的.race()
运算符,而不是使用.takeUntil()
。请参阅关于取消的redux-observable docs recipe中的示例:
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)
)
);