RxJS switchMap 不会取消内部合并的可观察值

2023-12-24

内部合并的可观察量不会以此代码终止(rxjs 5.5.6):

    let source = new Subject<string[]>();

    // when the source emits a vector of strings, output 
    // each string with a 1s delay
    source.switchMap(v => Observable.from(v)
        .map(s => Observable.of(s).delay(1000).do(s => console.log('do: ' + s)))
        // only one active observable at time  
        .mergeAll(1) 
    ).subscribe(val => console.log('result: ' + val));

    // emit two vectors, 1.5s apart
    Observable.interval(1500).take(2).map(i => ['a' + i, 'b' + i, 'c' + i])
        .subscribe(v => source.next(v));

输出是:

do: a0
result: a0
do: b0
do: a1
result: a1
do: c0
do: b1
result: b1
do: c1
result: c1

预期输出是:

do: a0
result: a0
do: a1
result: a1
do: b1
result: b1
do: c1
result: c1

也就是说,在第二个向量发出后, switchMap 应该取消订阅第一个向量上的可观察值,从而取消该可观察值。虽然取消订阅显然有效,但内部可观察仍在运行,如第一个示例的输出中的“do: a0 .. b0 .. c0”所示。

事实上,预期的输出正是您从这段代码中得到的:

    let source = 
        Observable.interval(1500).take(2).map(i => ['a' + i, 'b' + i, 'c' + i]);

    source.switchMap(v => Observable.from(v)
        .map(s => Observable.of(s).delay(1000).do(s => console.log('do: ' + s)))
        .mergeAll(1)
    ).subscribe(val => console.log('result: ' + val));

但为什么第一个例子的行为不一样呢?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RxJS switchMap 不会取消内部合并的可观察值 的相关文章

随机推荐