使用Observable.empty时,Rx.Observable没有按预期工作

时间:2018-02-02 14:47:58

标签: 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) => {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不会发出完整的通知

1 个答案:

答案 0 :(得分:1)

虽然Observable.empty()是一个可立即完成但不会发出任何事物的可观察对象,但它会从flatMap返回,因此省略了complete信号。上面的可观察是一个可观察到的,从来没有"结束(仅当订阅被取消订阅时)并且永远不会发出任何内容。

当你使用flatMap运算符时,你的observable使用返回的map函数的observable,取出发出的项(不是complete信号,但错误仍然是buble)并发出它们。由于map函数返回Observable.empty()flatMap运算符未找到要发出的项,跳过complete信号并且不返回任何内容。

emptynever之间的差异,就像在文档中一样,虽然两者都不会发出任何项目,但会发出信号表明它已完成({} {1}})一个人不会(empty)。