Reactive programming 一个observable发出N个其他observable的最新值的元组?

Reactive programming 一个observable发出N个其他observable的最新值的元组?,reactive-programming,reactivex,Reactive Programming,Reactivex,是否有类似的操作,但它不等待整个元组聚集,而是在每次更改时发出元组 例如,如果它只发出第二个可见的1A和B,它会立即发出1B,这是“最新”元组 开始时,此操作应等待所有N元素聚集。您要查找的通常称为zipLatest 下面是Python中的一个示例实现: 从输入导入* 进口接收 将rx.com作为ops导入 def zip_最新版本(*xss:rx.Observable)->rx.Observable: helper=ZipLatestHelper(len(xss)) 返回多路复用器(*xss)

是否有类似的操作,但它不等待整个元组聚集,而是在每次更改时发出元组

例如,如果它只发出第二个可见的
1A
B
,它会立即发出
1B
,这是“最新”元组


开始时,此操作应等待所有
N
元素聚集。

您要查找的通常称为
zipLatest

下面是Python中的一个示例实现:

从输入导入*
进口接收
将rx.com作为ops导入
def zip_最新版本(*xss:rx.Observable)->rx.Observable:
helper=ZipLatestHelper(len(xss))
返回多路复用器(*xss).pipe(
操作图(助手流程),
操作过滤器(λx:x不是无),
)
def mux(*xss:rx.可观测)->rx.可观测:
def pair_index(i:int)->可调用[[Any],元组[int,Any]]:
def-inner(x:Any)->Tuple[int,Any]:
返回i,x
返回内部
paired=[xs.pipe(ops.map(pair_index(i)),用于枚举(xss)中的i,xs)]
返回rx.from_iterable(paired).pipe(ops.merge_all())
Ziplates类车牌:
def uuu init uuu(self,num_流):
self.latest=[None for u in range(num_streams)]
self.ready=set()
def进程(self,pair:Tuple[int,Any])->可选[Tuple[Any,…]:
i、 x=对
自我最新[i]=x
self.ready.add(i)
返回(
tuple(self.latest)如果len(self.ready)==len(self.latest)否则无
)
使用方法:

从时间导入睡眠
zipped=zip\u最新版本(
rx.interval(0.5).pipe(ops.map(lambda i:f“A{i}”),
rx.interval(0.3).pipe(ops.map(lambda i:f“B{i}”),
)
压缩。订阅(打印)
睡眠(10)
输出:

('A0','B0')
(‘A0’、‘B1’)
('A0','B2')
(‘A1’、‘B2’)
('A1','B3')
(‘A2’、‘B3’)
(‘A2’、‘B4’)
(‘A2’、‘B5’)
注意事项:

  • 可能不是线程安全的
  • 如果流接收到未完成的
    时应该怎么做?压缩流应该继续发送项目,还是应该发出一个
    OnCompleted
  • 如果流接收到
    OnError
    ,该怎么办