Rxjs 基于源可观测值设置bufferCount值
我有一个场景,其中有一个RxJS事件流,我将其传递给一个自定义操作符。事件可以是Rxjs 基于源可观测值设置bufferCount值,rxjs,observable,Rxjs,Observable,我有一个场景,其中有一个RxJS事件流,我将其传递给一个自定义操作符。事件可以是 单个事件,意味着收到时它们已完成 部分事件,意味着它们是分块较大事件的一部分 事件类型为CustomEvent和CustomChunkedEvent,后者是根据第一个事件的数据构建的 interface ChunkedCustomEvent { id: string; // The id that chunks are grouped by index: number; chunk: string;
CustomEvent
和CustomChunkedEvent
,后者是根据第一个事件的数据构建的
interface ChunkedCustomEvent {
id: string; // The id that chunks are grouped by
index: number;
chunk: string;
chunkCount: number; // The number of chunks that make up the whole event
}
我的自定义操作符根据id对分块事件进行分组,然后使用bufferCount
缓冲事件,直到事件满,然后发出消息。如果区块计数与当前设置的缓冲区计数相同,这将非常有效,但我无法理解如何将bufferCount
值设置为chunkCount
值,因此它不是常数,而是每个区块组的不同值
此时,操作符看起来是这样的,但显然它是一个静态数字,用于缓冲计数
export function handleChunkedEvents(): MonoTypeOperatorFunction<CustomEvent> {
return pipe(
groupBy(customEvent => {
const chunkedEvent: ChunkedCustomEvent = { ...customEvent.data };
return chunkedEvent.id;
}),
mergeMap(group => {
return group.pipe(
bufferCount(4), // I want this to be equal of the known chunk count
map(groupOfChunked => {
// Do something with the grouped chunks and return it as a whole
// If it isn't a chunked event, return the event instead
})
)
})
);
}
导出函数handleChunkedEvents():monotype运算符函数{
回流管(
groupBy(customEvent=>{
const chunkedEvent:ChunkedCustomEvent={…customEvent.data};
返回chunkedEvent.id;
}),
合并映射(组=>{
回流管(
bufferCount(4),//我希望它等于已知的块计数
map(groupOfChunked=>{
//对分组的块执行一些操作,并将其作为一个整体返回
//如果它不是分块事件,则返回该事件
})
)
})
);
}
有没有一种方法可以实现我想要的,或者我的方法是错误的?
bufferCount
只是buffer
的一个方便的特例,它是缓冲区
基于可观察到的“信号”发射。这就是我们想要走的路
在这里
我们只处理下面的mergeMap
,因为这是我们需要更改的全部内容
你的例子
mergeMap((组$)=>{
//处理非分块的情况-具有未定义键的组将发出
//只有非分块事件-让它做它自己的事情
如果(!group$.key)返回组$;
//从组中,创建一个可观察的信号,该信号在chunkCount计数时触发
//匹配0索引加1
const chunkcountreated$=group$.filter((事件,i)=>event.data.chunkCount==i+1);
返回组$.pipe(
缓冲区(ChunkCountReach$),
map((groupOfChunked)=>{
//对分组的块执行一些操作,并将其作为一个整体返回
})
);
});
编辑:这也是一个有效的解决方案,其优点是完成
达到chunkCount
后可观察到的组
const chunkcountreated$=group$.filter((事件,i)=>event.data.chunkCount==i+1);
返回组$.pipe(
takeUntil(chunkcountreated$),
toArray(),
map((groupOfChunked)=>{
//对分组的块执行一些操作,并将其作为一个整体返回
})
);
最终编辑(因为我忍不住要编辑):
返回组$.pipe(
takeWhile((事件,i)=>i+1{
//对分组的块执行一些操作,并将其作为一个整体返回
})
);
“如果不是分块事件,则返回事件”如果事件不是更大整体的分块部分,则chunkedEvent.id
将未定义,因此不会按任何内容分组。在这种情况下,它应该只缓冲该事件并在事件发生后立即发出。这更有意义吗?这看起来很有希望,我会尽快看一看的!:)最后我使用了你的最后一次编辑,非常好@backtick,谢谢!这对我来说是一个很好的学习机会。请注意,takeUntil
将排除第一个未满足chunkcountreated$
条件的值,但是takeWhile
效果良好,因为它将inclusive
值设置为true!