为共享 Observable 创建沙盒
multicast
operator 还接受一个 selector
参数,这是一个函数参数,它有能力为我们的共享 Observable 创建一个沙盒环境(sandbox),只有在沙盒中,才能访问我们的共享 Observable:
function subjectFactory() {
console.log('create new subject');
return new Rx.Subject();
}
const result = Rx.Observable.interval(1000)
.take(3)
.do(v => console.log(`source ${v}`))
.multicast(subjectFactory, function selector(shared) {
const sharedDelayed = shared.delay(500);
const merged = shared.merge(sharedDelayed);
return merged;
});
result.subscribe(v => console.log(v));
/* 程序输出:
"create new subject"
"source 0"
0.7628090064782
0.7628090064782
"source 1"
0.3839690432494629
0.3839690432494629
"source 2"
0.886170569776507
0.886170569776507
"source 3"
0.6287819004515309
0.6287819004515309
"source 4"
0.960242366397593
0.960242366397593
"source 5"
0.31676626283307363
0.31676626283307363
*/
此时,result
就不再是一个 Connectable Observable,而只是一个普通的 Observable,因此,当执行 result.subscribe()
时,result
便开始执行了。
当我们想创建一个 菱形 依赖的时候,就可以考虑为 multicast
传递 selector
参数,菱形依赖意味着我们在使用共享 Observable 时,会出现 分岔 及 汇合:
shared
/\
/ \
/ \
/ \
shared sharedDelayed
\ /
\ /
\ /
\/
merged
更多情况下,我们使用支持了 refCount
的共享 Observable 即可。