gpt4 book ai didi

javascript - 如何在 RxJS 中取消 switchmap 链?

转载 作者:行者123 更新时间:2023-11-30 20:40:43 25 4
gpt4 key购买 nike

下面使用switchMap...

Rx.Observable.timer(0, 1000)

// First switchMap
.switchMap(i => {
if (i % 2 === 0) {
console.log(i, 'is even, continue');
return Rx.Observable.of(i);
}
console.log(i, 'is odd, cancel');
return Rx.Observable.empty();
})

// Second switchMap
.switchMap(i => Rx.Observable.timer(0, 500).mapTo(i))

.subscribe(i => console.log(i));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.min.js"></script>

...产生以下输出:

0 is even, continue
0
0
1 is odd, cancel
0 // <-------------------- why?
0 // <-------------------- why?
2 is even, continue
2
2
3 is odd, cancel
2 // <-------------------- why?
2 // <-------------------- why?
4 is even, continue
.
.
.

我希望得到以下输出:

0 is even, continue
0
0
1 is odd, cancel
2 is even, continue
2
2
3 is odd, cancel
4 is even, continue
.
.
.

我预计第一个 switchMap 每次返回时都会取消下游的所有内容,我猜这是不正确的。

有没有办法实现预期的行为?

最佳答案

原因是返回一个空的 observable 不会导致它切换到新的 observable,即第二个 switchMap 永远不会被调用。

一个非常hacky的解决方案是返回一个你以后可以忽略的魔法值

const CANCEL = {};
Rx.Observable.timer(0, 1000)

// First switchMap
.switchMap(i => {
if (i % 2 === 0) {
console.log(i, 'is even, continue');
return Rx.Observable.of(i);
}
console.log(i, 'is odd, send CANCEL observable');
return Rx.Observable.of(CANCEL);
})


// Second switchMap
.switchMap(i => Rx.Observable.timer(0, 500).mapTo(i))

// Filter out cancelled events
.filter(i => i != CANCEL)

.subscribe(i => console.log(i));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.min.js"></script>

关于javascript - 如何在 RxJS 中取消 switchmap 链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com