RxJS:另一个订阅后的明显休息

时间:2018-02-23 15:38:59

标签: javascript rxjs

我对distinct运算符感到困惑。据我所知,它应该只从源流中生成唯一值。在我的例子中有两个流。第二个使用distinct来防止产生重复的值,但是在另一个订阅之后再次生成新的(非唯一的)项。我很困惑为什么会这样。

const s1 = new Rx.Subject()
const s2 = s1.distinct().do(num => console.log(num))

a1 = s2.subscribe()
s1.next(1)
s1.next(1) // no produced because `distinct`
a2 = s2.subscribe()
s1.next(1) // produced, but why?
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.min.js"></script>

1 个答案:

答案 0 :(得分:1)

这是预期的行为,因为如果您为主题创建新订阅,则新创建的订阅不具有初始值。如果您发出下一个项目,它将被发送到新订阅,因为undefined!= 1

如果您希望实现仅在发生更改时发布到所有订阅的行为,则必须使用share运算符。

以下是一个例子:

const s1 = new Rx.Subject()
const notShared = s1
  .distinct();
const shared = notShared
  .share();

notShared.subscribe(_ => console.log('subscription 1:', _));
s1.next(1)
s1.next(1)
notShared.subscribe(_ => console.log('subscription 2:', _));
s1.next(1)
s1.next(1)

console.log('_'.repeat(30));
shared.subscribe(_ => console.log('shared subscription 1:', _));
s1.next(1)
s1.next(1)
shared.subscribe(_ => console.log('shared subscription 2:', _));
s1.next(1)
s1.next(1)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.min.js"></script>