当前位置: 首页 > 知识库问答 >
问题:

如何做不同的油门在RxJS

叶德运
2023-03-14

我已经花了几天时间,但找不到在RxJS中实现“独特节流”的方法。

假设每个事件以4个破折号完成,一个“不同的油门”将执行如下操作:

-①-②-①---------①-----|-

[明显的油门]

-①-②-------------①-----|-

如何使用现有的RxJS操作符构建“独特的节流阀”?

共有2个答案

柯耀
2023-03-14

distinctthrottle在物品挑选方面有两个不同的特征distinct将选择第一项,而throttle将选择最后一项。

有时,您希望保持限制的行为。

假设流是:聊天消息编辑事件,其中包含更新的文本。用户可以在节流周期内多次编辑特定消息
您希望确保始终保留每条消息的最新版本(在不同当前消息的编辑流中)。

下面是一个可能的解决方案

const source$ = from([
{id:1,content:"1a"}, 
{id:1,content:"1b"}, 
{id:1,content:"1c"}, 
{id:2,content:"2a"}, 
{id:2,content:"2b"}, 
{id:3,content:"3a"},
{id:3,content:"3b"},
{id:1,content:"1d"},
{id:1,content:"1e"},
{id:4,content:"4a"},
{id:4,content:"4b"},
{id:4,content:"4c"},
{id:4,content:"4e"},
{id:4,content:"4f"},
{id:3,content:"3c"},
{id:3,content:"3d"},
{id:3,content:"3e"}
]).pipe(concatMap((el)=> of(el).pipe(delay(500)) ));



const distinctThrottle = (throttleTime, keySelector)=>
    pipe(bufferTime(throttleTime),
          concatMap((arr)=>from(arr.reverse()).pipe(distinct(keySelector))  
        )) ;


let throttledStream = source$.pipe(distinctThrottle(1550, ({id})=>id));

throttledStream.subscribe(console.log);

周翼
2023-03-14

您可以使用groupBy按值分隔通知,然后可以应用throttleTime,然后可以使用mergeMap合并分组的观察值。这样地:

const { Subject } = rxjs;
const { groupBy, mergeMap, throttleTime } = rxjs.operators;

const source = new Subject();
const result = source.pipe(
  groupBy(value => value),
  mergeMap(grouped => grouped.pipe(
    throttleTime(400)
  ))
);

result.subscribe(value => console.log(value));

setTimeout(() => source.next(1), 100);
setTimeout(() => source.next(2), 300);
setTimeout(() => source.next(1), 400);
setTimeout(() => source.next(1), 900);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs@6/bundles/rxjs.umd.min.js"></script>
 类似资料:
  • 我有一个带有函数的简单点击事件,我尝试使用进行节流。在中,每次单击我的,油门似乎都不起作用,但当我使用debounce时,它就起作用了。 问题是每次点击和同时增加,但按预期工作,它等待和更新。 工作现场演示

  • 问题内容: 我正在尝试从功能组件中使用该方法,例如: 由于内部方法在每次渲染时都重新声明,因此限制效果不起作用。 有没有人有一个简单的解决方案? 问题答案: 经过一段时间后,我相信使用功能性助手(并将其移动到单独的自定义挂钩中)比使用功能性助手要容易得多。在稍后处理一个挑战之后,我们立即将其应用到由于依赖关系更改而可以重新创建的挑战中,但是我们不想重置延迟运行。 下面的原始答案 您可能(可能需要)

  • 问题内容: 我只想对elasticsearch执行以下请求。 在SQL中: 我只有 : 提前致谢 :) 问题答案: 您快到了,您只需要向查询添加汇总

  • 问题内容: 我有一个maxmemory_human 6.05 G和used_memory_human的Redis集群:4.62M 我想用转储数据来补充这个used_memory_human,所以我将有2G的used_memory_human 我该怎么办? 问题答案: 填充 used_memory_human:1.81G 清洁 used_memory_human:574.41K

  • 我要求允许在单个从节点的单个Jenkins作业中进行并发构建。 因此,我启用了throttle concurrent build选项,并发布了我能够进行并发构建的帖子。但是,如果我给MaxNo of concurrent builds 7或大于7,那么它总是一次处理6个构建,第7个构建处于等待状态。 在这种情况下有没有限制?

  • 在回答“亚马逊DynamoDB吞吐量是如何计算和限制的?”有人建议,只要超出每秒预配的吞吐量,DynamoDB就会限制请求。然而,这与我的经验相矛盾。 我在一个表中发布了多行,通常行数远远超过了配置的写容量。这种情况会在短时间内发生。在某一点上,我甚至有5分钟的平均时间超过了规定的容量。OTOH,平均15分钟低于容量。在那段时间里,我没有收到任何限制性的请求。 15分钟的平均峰值远低于规定的容量: