Javascript 使用Observable.empty时,Rx.Observable未按预期工作
RxJS版本:5.5.6 要复制的代码:Javascript 使用Observable.empty时,Rx.Observable未按预期工作,javascript,rxjs,observable,Javascript,Rxjs,Observable,RxJS版本:5.5.6 要复制的代码: var obs = Rx.Observable.interval(100) .startWith(0) .flatMap(() => { return Rx.Observable.empty(); }); var sub = obs.subscribe( (data) =&g
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)}
);
上面的代码不记录任何内容
预期行为:下一步,应触发完全回调
实际行为:未调用订阅回调
其他信息:
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()创建一个不向观察者发送任何项目的可观察对象
empty()创建一个不向观察者发送任何项目并立即发送完整通知的可观察对象
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不会发出完整的通知,而
Observable.empty()
是一个可以立即完成而不发出任何东西的Observable,它是从平面图
返回的,因此它的完成
信号被省略。上面的可观察项是一个“永不”结束的可观察项(仅当订阅被取消时),并且从不发出任何东西
当您使用flatMap
操作符时,您的可观察对象使用map函数返回的可观察对象,获取发出的项目(不是complete
信号,但错误仍会出现)并发出它们。由于map函数返回一个Observable.empty()
,因此flatMap
操作符未找到要发射的项目,因此跳过complete
信号,不返回任何内容
像在文档中一样,
空的
和从不
之间的区别是,虽然两者都不会发出任何项目,但一方会发出信号,表示项目已完成(空的
),另一方不会(从不
)。可观察。空的,它会发出更改。如果您编写以下代码``var obs=Rx.Observable.empty();var sub=obs.subscribe((数据)=>{console.log(数据,1);},(err)=>{console.log(err,2);},()=>{console.log(3);},)//它会记录3``是的,但是flatMap
操作符忽略了complete
信号,因此它不会返回任何内容。我已经更新了描述,请查看。那么.empty和.never之间有什么区别呢?谢谢你的解释。我已经更新了答案,如果你发现它能回答你的问题,请将它标记为已接受的答案。