微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 一个Observable,多个订阅者,不同的案例,使用rxjs5的不同share()行为

当两个订阅订阅一个observable时:

  let s = Observable.interval(1000).take(2).do(x => console.log('hey'));
  s.subscribe(n => console.log('subscriber  1 = ' + n));
  s.subscribe(n => console.log('subscriber  2 = ' + n));

控制台记录以下内容

hey
‘subscriber 1 = 0’
hey
‘subscriber 2 = 0’
hey
‘subscriber 1 = 1’
hey
‘subscriber 2 = 1’

使用.share():

let s = Observable.interval(1000).take(2).do(x => console.log('hey')).share();
  s.subscribe(n => console.log('subscriber  1 = ' + n));
  s.subscribe(n => console.log('subscriber  2 = ' + n));

控制台日志:

hey
‘subscriber 1 = 0’
‘subscriber 2 = 1’
hey
‘subscriber 1 = 0’
‘subscriber 2 = 1’

因此,我设法向超过1个订阅者共享相同的数据.
执行以下测试:

let s = Observable
    .from([-1, 0, 1, 2, 3])
    .filter(v => v > 0)
    .do(v => console.log('from', v));

  s.filter(v => v % 3 === 0)
    .subscribe(v => console.log('---0---', v));
  s.filter(v => v % 3 === 1)
    .subscribe(v => console.log('---1---', v));
  s.filter(v => v % 3 === 2)
    .subscribe(v => console.log('---2---', v));        

日志:

‘from’, 1 ‘from’, 2 ‘from’, 3 ‘—0—‘,3 ‘from’, 1 ‘—1—‘,1
‘from’, 2 ‘from’, 3 ‘from’, 1 ‘from’, 2 ‘—2—‘, 2 ‘from’, 3

再次,我使用share():

 let s = Observable
    .from([-1, 0, 1, 2, 3])
    .filter(v => v > 0)
    .do(v => console.log('from', v))
    .share();

  s.filter(v => v % 3 === 0)
    .subscribe(v => console.log('---0---', v));
  s.filter(v => v % 3 === 1)
    .subscribe(v => console.log('---1---', v));
  s.filter(v => v % 3 === 2)
    .subscribe(v => console.log('---2---', v));
});

尽管我使用了share(),但是来自数据的记录方式与上一次尝试的方式完全相同,没有share()(从1到2从3记录3次,每个用户1次).

那么,这些例子中的观察点之间的区别是什么?

如何在第二种情况下共享数据?

解决方法:

使用Rxjs 4,您应该从1到2从3只看到一次.但是,您只有一个过滤器日志记录. Rx.Observable.from(array)同步发出它的序列.因此,当s.filter(v => v%3 === 0).subscribe(v => console.log(‘— 0 —‘,v));执行后,您的可观察性已经完成.你可以在这里看到:[jsfiddle].输出是:

from 1
from 2
from 3
---0--- 3

在Rxjs 5中,共享操作符现在在结束时重新启动源并且新订户订阅.在第二个过滤器,s重新启动.因此,您在源序列生成过程中进行了三次.

为了说服你,将你的同步序列变成一个异步序列:jsfiddle.你现在应该得到,这是你所期望的:

from 1
---1--- 1
from 2
---2--- 2
from 3
---0--- 3

奇怪的是,migration guide中没有记录这一点.但是,您可以找到有关herehere更改动机的一些信息(简而言之,您可以获得改进的重复和重试语义).

也就是说,您仍然可以使用publish().refCount()来拥有Rxjs 4 share运算符.但如前所述,您的第二个过滤器将看不到数据,因为源已经完成.见:jsfiddle.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐