Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rxjs 基于源可观测值设置bufferCount值_Rxjs_Observable - Fatal编程技术网

Rxjs 基于源可观测值设置bufferCount值

Rxjs 基于源可观测值设置bufferCount值,rxjs,observable,Rxjs,Observable,我有一个场景,其中有一个RxJS事件流,我将其传递给一个自定义操作符。事件可以是 单个事件,意味着收到时它们已完成 部分事件,意味着它们是分块较大事件的一部分 事件类型为CustomEvent和CustomChunkedEvent,后者是根据第一个事件的数据构建的 interface ChunkedCustomEvent { id: string; // The id that chunks are grouped by index: number; chunk: string;

我有一个场景,其中有一个RxJS事件流,我将其传递给一个自定义操作符。事件可以是

  • 单个事件,意味着收到时它们已完成
  • 部分事件,意味着它们是分块较大事件的一部分
  • 事件类型为
    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!