等待Observable中发生一系列的emmisions

时间:2016-10-24 06:57:57

标签: rxjs

给定一个将项目推送到Observable A的流。

如果在A中推送了3个项目,如何通知订阅者?

想象它:

--o--i--o------i---------o----i------|---> A

我需要等待所有i到达,即使存在其他项目,例如o

如果在一个时间范围内没有确切地推送3 i,则触发错误以重做该过程。

感谢。

1 个答案:

答案 0 :(得分:0)

我会使用filter()仅过滤i个字符,count()来计算在源完成之前发出的所有项目,并使用concatMap()来确定项目数是否为纠正并最终抛出错误。

import {Observable} from 'rxjs';

Observable.from(['o', 'i', 'o', 'i', 'o', 'i'/*, 'i'*/])
    .filter(val => val == 'i')
    .count()
    .concatMap(count => count == 3 ? Observable.of(count) : Observable.throw('Expected 3 values'))
    .subscribe(
        count => console.log(count),
        err => console.log(err)
    );

打印到控制台:

3

如果您再向源Observable添加一个i,则订阅者会收到错误:

Expected 3 values

查看现场演示:http://plnkr.co/edit/VkQeGpY2gDj3gFhXD2uR?p=preview

如果您想在发生错误时重新订阅,请使用retry()retryWhen()。这另一个演示首先失败,因为它只包含2个i,但它重新订阅retry()然后成功。

以下是更复杂的演示:http://plnkr.co/edit/ID5WTVYGYZuhEJ7fXn1F?p=preview