为共享 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 即可。

results matching ""

    No results matching ""