给定一个将项目推送到Observable A的流。
如果在A中推送了3个项目,如何通知订阅者?
想象它:
--o--i--o------i---------o----i------|---> A
我需要等待所有i
到达,即使存在其他项目,例如o
。
如果在一个时间范围内没有确切地推送3 i
,则触发错误以重做该过程。
感谢。
答案 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