RxJS版本: 5.5.6
要重现的代码:
var obs = Rx.Observable.interval(100)
.startWith(0)
.flatMap(() => {
return Rx.Observable.empty();
});
var sub = obs.subscribe(
(data) => {console.log(data, 1)},
(err) => {console.log(err, 2)},
() => {console.log(3)}
);
上面的代码没有记录任何内容
预期行为:接下来,应触发完整回调
实际行为:尚未调用订阅回调
其他信息:
如果我们flatMap返回Rx.Observable.of({}),则调用回调。
根据RxJS文档 Observable.never()创建一个Observable,它不向Observer发送任何项目。
Observable.empty()创建一个Observable,它不向Observer发送任何项目,并立即发出完整的通知。
var obs = Rx.Observable.empty();
var sub = obs.subscribe(
(data) => {
console.log(data, 1);
},
(err) => {
console.log(err, 2);
},
() => {
console.log(3);
},
);
//上面的代码记录3
如果我们使用Observable.interval(),那么Observable.empty不会发出完整的通知
答案 0 :(得分:1)
虽然Observable.empty()
是一个可立即完成但不会发出任何事物的可观察对象,但它会从flatMap
返回,因此省略了complete
信号。上面的可观察是一个可观察到的,从来没有"结束(仅当订阅被取消订阅时)并且永远不会发出任何内容。
当你使用flatMap
运算符时,你的observable使用返回的map函数的observable,取出发出的项(不是complete
信号,但错误仍然是buble)并发出它们。由于map函数返回Observable.empty()
,flatMap
运算符未找到要发出的项,跳过complete
信号并且不返回任何内容。
empty
和never
之间的差异,就像在文档中一样,虽然两者都不会发出任何项目,但会发出信号表明它已完成({} {1}})一个人不会(empty
)。