在下面的示例中,foo
从bar
接收数据,但在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();
答案 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()