const observable = new rxjs.BehaviorSubject(0);
observable.subscribe(v => console.log(v));
rxjs
.of(1)
.pipe(rxjs.operators.delay(500))
.subscribe(v => observable.next(v));
observable.next(2);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.js"></script>Run Code Online (Sandbox Code Playgroud)
正如您所看到的,上面的 observable 按顺序发出 3 个值:0、2、1。
当发出值“2”时是否可以取消(或忽略)值“1”?(无需关闭订阅)
看来你需要switchMap从你的来源开始并应用delay它的内部。
switchMap(value =>
of(value).pipe(delay(50))
)
Run Code Online (Sandbox Code Playgroud)
带延迟的 switchMap 的插图和游乐场:
这是一个片段:
switchMap(value =>
of(value).pipe(delay(50))
)
Run Code Online (Sandbox Code Playgroud)
const {Subject, of} = rxjs;
const {switchMap, delay} = rxjs.operators;
const subject = new Subject(0);
subject
.pipe(
switchMap(value =>
// switchMap to a delayed value
of(value).pipe(delay(500))
)
)
.subscribe(v => console.log(v));
// immediately emit 0
subject.next(0);
// emit 1 in 1 sec
setTimeout(()=>{
subject.next(1);
}, 1000)
// emit 2 in 1.2 sec
setTimeout(()=>{
subject.next(2);
}, 1200)Run Code Online (Sandbox Code Playgroud)
这是一个鼠标悬停的例子
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.js"></script>Run Code Online (Sandbox Code Playgroud)
const {fromEvent, merge, of, EMPTY} = rxjs;
const {switchMap, delay, mapTo} = rxjs.operators;
const button = document.getElementById('pane');
const mouseOver$ = fromEvent(button, 'mouseover').pipe(
mapTo(true)
);
const mouseOut$ = fromEvent(button, 'mouseout').pipe(
mapTo(false)
);
merge(mouseOver$, mouseOut$)
.pipe(
switchMap(value => {
if (!value) { return EMPTY; }
return of('mouse is over').pipe(delay(500))
})
)
.subscribe(v => console.log(v));Run Code Online (Sandbox Code Playgroud)
希望这可以帮助
| 归档时间: |
|
| 查看次数: |
2969 次 |
| 最近记录: |