我想轮询更改,当达到所需的值时,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')));
答案 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