【问题标题】:Is it possible to not receive a message from an observable if I'm only using complete: () =>?如果我只使用完整的:()=>,是否可以不接收来自可观察的消息?
【发布时间】:2020-01-30 08:15:21
【问题描述】:

只是想了解更多关于 Angular 中的 observables 并在阅读Angular observable documentation 时,它说,根据定义

“执行完成通知的处理程序。延迟的值可以在执行完成后继续传递给下一个处理程序”

所以我想知道这是如何工作的?

问题 - 这是否意味着如果我发送“消息”,如果我只使用选项完成,我可能不会收到它:() =>

this.someService.getMessage().subscribe({message => {
  error: err => console.error('Observer got an error: ' + err),
  complete: () => console.log(message.whatever),
}
});

【问题讨论】:

    标签: angular typescript rxjs angular2-observables angular-observable


    【解决方案1】:

    这是否意味着如果我发送“消息”,如果我只使用选项完成,我可能不会收到它

    complete 处理程序不适用于使用发送的任何消息。它仅在 Observable 被标记为完成时做出响应。以下是它的使用方法:

    this.someService.getMessage().subscribe({
      next: message => console.log(message);
      error: err => console.error('Observer got an error: ' + err),
      complete: () => console.log('Observer was closed'),
    });
    

    因此,如果上例中的 Observable 在标记为完成之前发出一条消息(“hello”),您会看到:

    你好
    观察者已关闭

    还有一个有趣的地方:

    延迟值可以在执行完成后继续传递给下一个处理程序

    这基本上意味着在某些(相对罕见的)情况下,Observable 可能会在最后一条消息出现之前 被标记为完成。这可能最终看起来像这样:

    观察者已关闭
    你好

    这会有点奇怪和意外,这就是为什么他们要确保在文档中提到它,所以你要考虑你的处理程序中的可能性。

    当然,如果您像这样省略 next 处理程序:

    this.someService.getMessage().subscribe({
      error: err => console.error('Observer got an error: ' + err),
      complete: () => console.log('Observer was closed'),
    });
    

    ...那么无论从该订阅收到多少条消息,您都只会看到以下内容:

    观察者被关闭

    【讨论】:

    • @user1186050:这完全取决于 getMessage() 返回的 Observable 类型,以及它与其他组件的关系。例如,你怎么知道“所有组件都发送了它们的值”?如果有一个 Observable 设置为仅发出从其他组件发送到您的服务的消息,那么该 Observable 可能永远不会complete。或者它可能只有在服务被销毁时才会完成。
    • 嗨 Stripling。那么我应该总是使用下一个吗?文档说这是“必需的”我只是在做一个项目,我看到很多这样的调用没有下一个,只是完成了。前任。登录网站。在它调用控制器之后,post 方法返回并且订阅者只有一个 () 并且没有下一个。
    • @user1186050:大多数时候观察者对nextcomplete 更感兴趣。但是这两个处理程序有不同的目的,所以我不会说“总是”使用下一个。只需了解每个人的作用,并为您的目的使用正确的人。通常,如果您知道 observable 只会发出(最多)一个值然后完成,我发现将 promise 调用 .toPromise()await 而不是 subscribe 调用 observable 很有用。
    • 当我登录用户时怎么办。控制器有一个 post 方法。我会在这里使用下一个还是完成?
    • 如果除了成功/失败状态之外,您不希望从服务器返回任何数据,那么这并不重要:nextcomplete 都将被调用,在彼此很短的时间。如果登录端点返回您需要的用户信息,请使用next 处理程序,因为该数据将作为next 的参数返回。 complete 不接受任何参数。如果您不需要 observable 的更高级功能(例如取消),HTTP 请求通常也是转换为 Promise 的理想选择。
    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    相关资源
    最近更新 更多