【问题标题】:Does an Observable necessarily complete when it emits data?Observable 在发出数据时是否必须完成?
【发布时间】:2019-08-02 23:45:47
【问题描述】:

在使用 rxjs 时,我经常订阅我的源 Observable 并使用 onDataonError 处理程序,附加一些逻辑来处理每种情况。看起来像:

this.myService.myObservable().subscribe(
    () => this.onNextData(),
    () => this.onErrorData()
);

然后(有时),在每个处理程序内部,我将执行相同的逻辑,例如,在成功时关闭模式在失败时。

我看到有一个finalize 运算符,我可以通过管道将其执行一些基于onCompleteonError 的逻辑。但是,这两种状态是否相同? Observable 在发出数据时是否一定要complete

例子:

this.myService.myObservable()
    // modalClose always happens on success and on failure (?)
    .pipe(finalize(() => this.modalClose())
    .subscribe(
        () => this.onNextData(),
        () => this.onErrorData()
);

【问题讨论】:

  • 除了很好的答案,我还有一个“动作”流的例子,这里没有完成:stackblitz.com/edit/angular-todos-deborahkuserSelectedAction$ Observable 每次用户从下拉菜单中选择一个用户时都会发出下。这个 Observable 永远不会完成。

标签: rxjs


【解决方案1】:

不,Observable 在发出数据时不一定是complete

与 Promise 不同,Observables 是为多次发射而明确设计的——因此在一次发射后总是 complete 是没有意义的。

complete 视为 Observable 说“我永远不会向您发送更多数据”。

对于一个非常常见的用例,例如发出网络请求 - 它会发出一个值或一个错误,然后发出 complete,这是正常的。

对于不同的用例,例如应用程序的一部分与另一部分通信 - 它通常会发送多条消息,并且在源被删除时仅发送 complete


来自documentation

Observables 是多个值的惰性 Push 集合。他们填补 下表中的缺失点:

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 2019-03-06
    • 1970-01-01
    • 2012-12-23
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多