从使用switch构建的observable接收完成的通知

时间:2015-08-13 22:50:28

标签: rxjs

在下面的示例中,foobar接收数据,但在bar完成时忽略。 foo完成后baz完成,这不是我想要的行为。

var baz = Rx.Observable.interval( 50 ).take( 10 );

var foo = baz
    .select(function (x) { 
        var bar = Rx.Observable.range(x, 3);
        return bar;
    })
    .switch();

是否有switch的变体或可用于使新创建的foo可观察文件与bar具有相同生命周期的技术?也就是说,如果foo完成,我希望bar完成。

解决方案:

var baz = Rx.Observable.interval( 50 ).take( 10 );

var foo = baz
    .select(function (x) { 
        var bar = Rx.Observable.range(x, 3).materialize()
        return bar;
    })
    .switch()
    .dematerialize();

1 个答案:

答案 0 :(得分:3)

根据定义,

onCompleted()是一个终端案例,因此您无法直接在外部onCompleted()收到Observable

根据您需要使用onCompleted的方式,您有几个选项。

您可以使用.tapOnCompleted().finally()来处理流终止的副作用:

var foo = Rx.Observable.range(0, 3)
.select(function (x) { 
    return Rx.Observable.range(x, 3)
           .tapOnCompleted(function(){/*Apply side effect*/});
          //Or .finally()

})
.switch();

或者您需要materialize内部流来处理值:

var foo = Rx.Observable.range(0, 3)
.select(function (x) { 
    var bar = Rx.Observable.range(x, 3)
    .materialize();
    return bar;
})

.switch()

foo.subscribe(function(x) {
  if (x.kind == 'N') {
    process(x.value);
  } else if (x.kind == 'C') { /*Do something else*/}
});

请注意,在switch发生时您提供的示例Observable将无法完成,只会完成最后一个,因为后续值过快。

如果所有序列都应该运行直到完成,您应该使用concatAll()代替switch()