我对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>
答案 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>