Как продолжить наблюдаемую цепочку при условии - PullRequest
0 голосов
/ 08 мая 2018

Скажите, что я хочу отправить комментарий в приложении чата, но только если некоторая переменная имеет значение true (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 так, что отдельная переменная не должна быть сохранена для подписки и отписаться на

1 Ответ

0 голосов
/ 10 мая 2018

Когда this.state.alive и this.stateShouldSendMessage являются простыми значениями, а не некоторыми потоками, вам не нужно обрабатывать их асинхронно:

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

Когда, например, this.state.alive является наблюдаемой (что может иметь смысл), вы можете сделать что-то вроде этого: alive$.filter(alive => alive === true).mergeMapTo(this.Chat.sendMessage(myMessage)), чтобы достичь того же эффекта.

...