【问题标题】:Rx.Observable not been working as expected with using Observable.empty使用 Observable.empty 时,Rx.Observable 没有按预期工作
【发布时间】:2018-07-13 02:24:58
【问题描述】:

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() 创建一个不向 Observer 发出任何项目的 Observable。

Observable.empty() 创建一个不向 Observer 发出任何项目并立即发出完整通知的 Observable。

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 不会发出完整的通知

【问题讨论】:

    标签: javascript rxjs observable


    【解决方案1】:

    虽然Observable.empty() 是一个可以立即完成而不发出任何东西的可观察对象,但它是从flatMap 返回的,因此省略了complete 信号。上面的 observable 是一个“永不”结束的 observable(仅当订阅被取消订阅时)并且从不发出任何东西。

    当您使用 flatMap 运算符时,您的 observable 使用 map 函数返回的 observable,获取发出的项目(不是 complete 信号,尽管错误仍然会冒泡)并发出它们。因为您的 map 函数返回 Observable.empty(),所以 flatMap 运算符找不到要发出的项目,跳过 complete 信号并且什么都不返回。

    emptynever 之间的区别是,如文档中所示,虽然两者都不会发出任何项目,但一个会发出完成的信号 (empty),一个不会发出 ( never)。

    【讨论】:

    • Observable.empty,它确实会发出变化。如果你写下面的代码``` var obs = Rx.Observable.empty(); var sub = obs.subscribe( (data) => { console.log(data, 1); }, (err) => { console.log(err, 2); }, () => { console.log( 3); }, ); //它会记录 3 ```
    • 是的,但是flatMap 运算符省略了complete 信号,因此它什么也不返回。
    • 我已经更新了描述,请看一下。 .empty 和 .never 之间有什么区别?
    • 感谢您的解释。
    • 我已经更新了答案,如果您发现它可以回答您的问题,请将其标记为已接受的答案。
    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    • 2012-07-02
    • 2011-09-07
    • 2013-03-03
    相关资源
    最近更新 更多