【问题标题】:Correct way to use FlatMap in Rx?在 Rx 中使用 FlatMap 的正确方法?
【发布时间】:2019-02-08 22:50:25
【问题描述】:

flatMap的使用方法正确吗?

const observer = Observable
    .interval(3000)
    .takeUntil(Observable.timer(10000))
    .flatMap(this.askToReadyRecordVideo);

private askToReadyRecordVideo(): Observable<any> {
    return this.requestMethods.askToReadyRecordVideo({});
}

在这一行中,我绑定了每 3 秒向服务器发送一次请求,直到 10 秒,然后调用从服务器返回数据的方法 this.askToReadyRecordVideo()

当我得到成功响应时,我完成了这个。是真的吗?

【问题讨论】:

  • 这应该做你设置做的事情。除了在获取成功响应后它不会停止。它只会在第 10 秒停止。
  • 如何使用该权限进行请求?
  • 当我从服务器获得成功的结果时,我需要停止进程
  • 那么,是 10 秒还是成功? 10秒已完成。恕我直言,成功停止过程应该是订户的工作。 observer.takeUntil(res=&gt;!res.success)..subscribe()
  • 如果处理错误/成功调用,您可能需要retryretryWhen

标签: angular rxjs rxjs5


【解决方案1】:

我不确定我是否理解正确,但您的代码执行以下操作: askToReadyRecordVideo 方法将每 3 秒调用一次,直到 10 秒结束(将在 3 秒、6 秒和 9 秒时调用 3 次)。 您的 observable observer 将发出这些服务器调用的结果。

如果您想在第一次成功响应后取消该过程,请添加以下内容:

.filter(resp => /* return true when resp indicates success */)
.take(1)

如果每个答案都是成功的(即错误由通过 observable 推送的错误事件指示),那么只需省略 filter 行。

顺便说一句:传递回调时要小心,以免对thisaskToReadyRecordVideos 中的含义感到意外。您可以使用flatMap(() =&gt; this.askToReadyRecordVideo())flatMap(this.askToReadyRecordVideo.bind(this)) 代替flatMap(this.askToReadyRecordVideo)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2021-08-30
  • 2019-06-14
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多