如何共享一个主题源

时间:2019-06-25 08:21:14

标签: rxjs rxjs6

我正试图在多个功能中共享一个主题源,这些功能可以过滤它们的动作并执行适当的任务,那些未被过滤的功能应该在不做任何修改的情况下陷入困境。

我尝试过合并同一源,但是它并不能真正按照我需要的方式工作...

npm i

在这种情况下,我得到原始来源+过滤后的来源。

我希望能够为可以过滤类型并执行异步行为的多个函数提供相同的源,其余未过滤的类型应该会陷入低谷。希望这足够清楚,否则将尝试做一个更好的例子。谢谢!

example here

1 个答案:

答案 0 :(得分:0)

基本上,您需要一个包含操作的来源。主题是执行此操作的好方法。

然后,您要对每种类型的动作进行一些处理。您可以filtersubscribe到每个子流。

const add$ = source.pipe(filter(a => a.type === "add")).subscribe(function onAddAction(a) {});
const remove$ = source.pipe(filter(a => a.type === "remove")).subscribe(function onRemove(a) {});

或者您可以准备子流,然后再次合并到所有已处理的操作。

const add$ = source.pipe(filter(a => a.type === "add"), tap(onAdd));
const remove$ = source.pipe(filter(a => a.type === "remove"), tap(onRemove));
const processedAction$ = merge(add$, remove$);
processedAction$.subscribe(logAction);

如果需要对所有操作进行一些预处理,则可以使用shareshareReplaytoAction每个项目只会被调用一次。

const subject = new Subject();
const action$ = subject.pipe(map(toAction), share());
const add$ = action$.pipe(filter(isAdd));
...
merge(add$, remove$).subscribe(logAction);

如果您在拆分时遇到问题:

function not(predicate) {
    return function(item, ...args) {
        return !predicate(item, ...args);
    }

}

function any(...predicates) {
    return function(item, ...args) {
         return predicates.some(p => p(item, ...args));
    }
}

const a = source.pipe(filter(fa), map(doA));
const b = source.pipe(filter(fb), map(doB));
const c = source.pipe(filter(fc), map(doC));
const rest = source.pipe(filter(not(any(fa, fb, fc)));
merge(a, b, c, rest).subscribe(logAction);