Rxjs 从使用开关构建的观察对象接收完成通知
在下面的示例中,Rxjs 从使用开关构建的观察对象接收完成通知,rxjs,Rxjs,在下面的示例中,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(); 是否有一种开关的变体或一种我可
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();
是否有一种开关的变体
或一种我可以用来让新创建的foo
可观察的技术与条
具有相同的寿命?也就是说,我希望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();
onCompleted()
根据定义是一个终端案例,因此您不能直接在外部可观察的中接收onCompleted()
根据需要如何使用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();
或者,您需要具体化内部流来处理值:
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*/}
});
请注意,在您给出的示例中,当出现开关时,可观察的
将不会完成,只有最后一个将完成,因为后续值的输入速度太快
如果所有序列都应该一直运行到完成,您应该使用concatAll()
而不是switch()
onCompleted()
根据定义是一种终端情况,因此您不能直接在外部可观察的中接收onCompleted()
根据需要如何使用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();
或者,您需要具体化内部流来处理值:
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*/}
});
请注意,在您给出的示例中,当出现开关时,可观察的
将不会完成,只有最后一个将完成,因为后续值的输入速度太快
如果所有序列都应该一直运行到完成,您应该使用concatAll()
而不是switch()
onCompleted()
根据定义是一种终端情况,因此您不能直接在外部可观察的中接收onCompleted()
根据需要如何使用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();
或者,您需要具体化内部流来处理值:
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*/}
});
请注意,在您给出的示例中,当出现开关时,可观察的
将不会完成,只有最后一个将完成,因为后续值的输入速度太快
如果所有序列都应该一直运行到完成,您应该使用concatAll()
而不是switch()
onCompleted()
根据定义是一种终端情况,因此您不能直接在外部可观察的中接收onCompleted()
根据需要如何使用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();
或者,您需要具体化内部流来处理值:
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*/}
});
请注意,在您给出的示例中,当出现开关时,可观察的
将不会完成,只有最后一个将完成,因为后续值的输入速度太快
如果所有序列都应该一直运行到完成,那么您应该使用concatAll()
而不是switch()
我修改了示例,希望它更清晰一些。我真的很惊讶,我想要实现的目标竟然没有操作员。RxJS没有具体化,否则会起作用。我修改了示例,希望它更清晰一些。我真的很惊讶,我想要实现的目标竟然没有操作员。RxJS没有具体化,否则会起作用。我修改了示例,希望它更清晰一些。我真的很惊讶,我想要实现的目标竟然没有操作员。RxJS没有具体化,否则会起作用。我修改了示例,希望它更清晰一些。我真的很惊讶,我想要实现的目标竟然没有操作员。RxJS没有具体化,否则会起作用。