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没有具体化,否则会起作用。