3

内部のマージされたオブザーバブルは、このコードで終了しません (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

つまり、2 番目のベクトルが発行された後、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));

しかし、最初の例が同じように動作しないのはなぜでしょうか?

4

0 に答える 0