RxJs Observable interval直到达到所需值

时间:2016-07-27 07:59:09

标签: rxjs observer-pattern observable

我想轮询更改,当达到所需的值时,Observable应该完成(或等到超时)。现在我使用过滤器工作正常,等到达到所需的值。但我希望Observable在等待这个值时推送事件。

例如,我等待状态'成功'直到状态变为成功'状态'测试'从我的服务返回。但由于过滤器正在等待“成功”,“测试”等等。永远不会回来。

我的代码现在:

return Observable
  .interval(this.POLL_TIMEOUT)
  .flatMap(() => this.getSingleProjectStatus(projectId, repoName))
  .filter(data => this.finishedStatus(data.status))
  .take(1)
  .timeout(this.MAX_TIMEOUT, Observable.throw(new Error('Timeout')));

1 个答案:

答案 0 :(得分:0)

您可能需要takeWhile而不是filter

return Observable
  .interval(this.POLL_TIMEOUT)
  .flatMap(() => this.getSingleProjectStatus(projectId, repoName))
  .takeWhile(data => this.finishedStatus(data.status))
  .timeout(this.MAX_TIMEOUT, Observable.throw(new Error('Timeout'));

注意上面的所有除了最后一个事件,如果你想要最后一个事件,你需要有点麻烦。

  const source = Observable.interval(this.POLL_TIMEOUT)
    .flatMap(() => this.getSingleProjectStatus(projectId, repoName))
    .share();

  source
    .takeUntil(source.filter(data => this.finishedStatus(data.status)))
    .timeout(this.MAX_TIMEOUT, Observable.throw(new Error('Timeout'));

在这种情况下,您将获取所有结果,直到另一个Observable发出,在这种情况下,另一个Observable只是source已过滤,因此它只会发出成功事件。

JsBin:http://jsbin.com/sojosuhune/edit?html,js,console,output