【问题标题】:How to continue Observable chain on condition如何在有条件的情况下继续 Observable 链
【发布时间】:2018-05-10 19:26:52
【问题描述】:

假设我想在聊天应用程序中发送评论,但前提是某些变量为真 (shouldSendMessage),使用 Observables 实现此目的的最佳方法是什么?

这可行,但很丑:

Observable.of({})
  .takeWhile(() => this.state.alive)
  .flatMap(() => this.state.shouldSendMessage ? Observable.of({}) : Observable.empty())
  .flatMap(() => this.Chat.sendMessage(myMessage))
  .subscribe(x => {
    //Do something after message sent successfully
  });

我想做得更好的两行是:

Observable.of({})

.flatMap(() => this.state.shouldSendMessage ? Observable.of({}) : Observable.empty())

注意:this.state.alive 是为了不需要为订阅和取消订阅存储单独的变量

【问题讨论】:

  • 你为什么要这样创建这个可观察链?服务调用之前的所有事情都不需要用 observables 来完成,这是您不喜欢代码的原因。
  • @DanielWSrimpel 我还不知道是否要调用sendMessage,因为这取决于其他条件
  • 你的 Promise 链最多只能运行一次你所拥有的(因为你的链的开始会发出一个值)。您可以在发送逻辑之前拥有所有逻辑,而不是在 observable 中完成
  • 另外,如果你真的需要这样的链,你实际上会想要使用filter(例如filter(() => this.state.shouldSendMessage))而不是你的第一个flatMap
  • @DanielWSrimpel 感谢您的回复。如果检查通过,您会建议仅运行某些方法的最佳方法是什么?我不能把sendMessage 放在第一位,因为它会一直运行。链中应该先出现什么? (不只是使用if condition

标签: angular typescript rxjs observable


【解决方案1】:

this.state.alivethis.stateShouldSendMessage 是简单值而不是某些流时,您不需要异步处理它们:

...
send: myMessage => {
  if (!this.state.alive || !this.stateShouldSendMessage) {
    return Observable.empty();
  }
  return this.Chat.sendMessage(myMessage); 
},
...

例如当this.state.alive 是一个 Observable(这可能是有道理的)你可以这样做:alive$.filter(alive => alive === true).mergeMapTo(this.Chat.sendMessage(myMessage)) 来达到同样的效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多