如何在另一个 Observable 发出时停止发出的值?
How to stop an emited value when another Observable emits?
有两个 Observable,一个发出 mouseover 事件(去抖动 500 毫秒),另一个发出 mouseout 事件,我正在寻找一种可能性来阻止第一个 Observable(mouseover)在第二个 Observable(mouseout)时发出) 发生。
let mouseOutObservable = Observable.fromEvent($('.row'), 'mouseout')
Observable.fromEvent($('.row'), 'mouseover')
.debounceTime(500)
// .stopEmitingWhen(mouseOutObservable) --> how? possible?
.subscribe(event => {
// show tooltip
mouseOutObservable.first()
.subscribe(() => {
// destroy tooltip
});
});
您可以获得鼠标悬停事件的订阅对象,然后在 mouseout 函数中处理该订阅。
let mouseOutObservable = Rx.Observable.fromEvent($('.row'), 'mouseout')
let mouseOverObservable = Rx.Observable.fromEvent($('.row'), 'mouseover')
.debounce(500);
let mouseOverObservableSubscription = mouseOverObservable.subscribe(() => { $('#output').append('<p>mouseover</p>'); });
mouseOutObservable.subscribe(() => {
$('#output').append('<p>mouseout</p>');
mouseOverObservableSubscription.dispose();
})
.row {
min-height: 48px;
background-color: orange;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.6/rx.all.js"></script>
<div class="row">Mouse over me!</div>
<div id="output"></div>
Matt Burnell 和 Ivan Malagon 建议的解决方案在没有相邻元素的情况下工作正常。但是我的行元素确实出现在 table 内。我确实写了我的问题 kinda interpretable。应用他们的代码建议将 unsubscribe/dispose 完全订阅,但我确实需要一个解决方案来阻止只有当前发出的值到达订阅。
然而,这两个答案确实解决了我上面的问题。 ;-) 因此我接受了 Matt Burnell 的简短回答。
为了满足我的额外要求,我提出了另一种解决方案,将两个可观察到的合并为一个,然后使用去抖动时间,仅当最后一个事件是鼠标悬停事件时才继续。
Observable.fromEvent($('.row'), 'mouseover')
.merge(mouseOutObservable)
.debounceTime(500)
.filter(event => event[ 'type' ] === 'mouseover')
.subscribe(event => {
// ....
});
takeUntil
做你想做的。
有两个 Observable,一个发出 mouseover 事件(去抖动 500 毫秒),另一个发出 mouseout 事件,我正在寻找一种可能性来阻止第一个 Observable(mouseover)在第二个 Observable(mouseout)时发出) 发生。
let mouseOutObservable = Observable.fromEvent($('.row'), 'mouseout')
Observable.fromEvent($('.row'), 'mouseover')
.debounceTime(500)
// .stopEmitingWhen(mouseOutObservable) --> how? possible?
.subscribe(event => {
// show tooltip
mouseOutObservable.first()
.subscribe(() => {
// destroy tooltip
});
});
您可以获得鼠标悬停事件的订阅对象,然后在 mouseout 函数中处理该订阅。
let mouseOutObservable = Rx.Observable.fromEvent($('.row'), 'mouseout')
let mouseOverObservable = Rx.Observable.fromEvent($('.row'), 'mouseover')
.debounce(500);
let mouseOverObservableSubscription = mouseOverObservable.subscribe(() => { $('#output').append('<p>mouseover</p>'); });
mouseOutObservable.subscribe(() => {
$('#output').append('<p>mouseout</p>');
mouseOverObservableSubscription.dispose();
})
.row {
min-height: 48px;
background-color: orange;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.6/rx.all.js"></script>
<div class="row">Mouse over me!</div>
<div id="output"></div>
Matt Burnell 和 Ivan Malagon 建议的解决方案在没有相邻元素的情况下工作正常。但是我的行元素确实出现在 table 内。我确实写了我的问题 kinda interpretable。应用他们的代码建议将 unsubscribe/dispose 完全订阅,但我确实需要一个解决方案来阻止只有当前发出的值到达订阅。
然而,这两个答案确实解决了我上面的问题。 ;-) 因此我接受了 Matt Burnell 的简短回答。
为了满足我的额外要求,我提出了另一种解决方案,将两个可观察到的合并为一个,然后使用去抖动时间,仅当最后一个事件是鼠标悬停事件时才继续。
Observable.fromEvent($('.row'), 'mouseover')
.merge(mouseOutObservable)
.debounceTime(500)
.filter(event => event[ 'type' ] === 'mouseover')
.subscribe(event => {
// ....
});
takeUntil
做你想做的。