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

如果x毫秒前发生相同的发射,则阻止发射

黄博艺
2023-03-14

当且仅当相同的项目在最后x毫秒内发射时,我想防止发射发生。我已经查看了油门和防抖操作符,但我不确定它们是否可以在这里帮助我。我可以使用其他操作符吗,或者我可以以某种方式组合它们吗?

共有3个答案

刘胜泫
2023-03-14

因为您的问题没有完全解释像比较下一个发射值与最后一个发射值或任何最后一个发射值或其他情况这样的场景。我会采取一种通用的方法来解决这个问题。

示例在RxJava中。

可以将timestamp()filter()操作符一起使用,如下所示:

ArrayList<String> list = new ArrayList<>();
        final long[] timeOfSubscribe = {-1};
        final long timeDuration = 2 * 1000; // 2 seconds
        Observable.fromIterable(list)
                .timestamp()
                .filter(item -> item.time() > (timeDuration + timeOfSubscribe[0]) && item.value().equals("your last value"))
                .doOnSubscribe(__ -> timeOfSubscribe[0] = Calendar.getInstance().getTimeInMillis())
                .subscribe();

我想这段代码可以帮助您只需更改位于filter()操作符中的发出值比较登录名。如果您正在查找上次发出的值,可以使用操作符停止上次发出的值(以便于使用简单的大小写),或者如果您正在查找所有上次发出的值,则需要将发出的值存储在列表中并进行检查。

我希望这有帮助。

曹君墨
2023-03-14

您可以为每个项目添加时间戳并配对,然后检查时间和相等的边界条件。

   randomSource
                .timestamp()
                .pairwise()
                .where(pair => pair[0].timestamp - pair[1].timestamp < limit && pair[0].value === pair[1].value);

然后应用<代码>。选择(配对=

C#中的工作示例,其源在随机时间间隔内生成1到5个随机项目:

    static IObservable<T[]> Pairwise<T>(this IObservable<T> source)
    {
        source = source.Publish().RefCount();
        return source.Skip(1).Zip(source, (a, b) => new[] { a, b });
    }

    static void Main(string[] args)
    {

        var randomSource =
            Observable.Defer(() => Observable.Timer(TimeSpan.FromSeconds(new Random().NextDouble() * 2))).Repeat().Publish().RefCount().Select(_ => new Random().Next(1, 5));

        var limit = TimeSpan.FromSeconds(1);

        var sameDebounce =
        randomSource
            .Timestamp()
            .Pairwise()
            .Where(pair => pair[0].Timestamp - pair[1].Timestamp < limit && pair[0].Value == pair[1].Value);


        sameDebounce.Subscribe(c => Console.WriteLine("{0} {1}", c[0], c[1]));
        Console.ReadLine();

    }

输出:

2@9/7/2017 5:00:04 AM +00:00 2@9/7/2017 5:00:04 AM +00:00
2@9/7/2017 5:00:09 AM +00:00 2@9/7/2017 5:00:08 AM +00:00
1@9/7/2017 5:00:23 AM +00:00 1@9/7/2017 5:00:23 AM +00:00
2@9/7/2017 5:00:33 AM +00:00 2@9/7/2017 5:00:32 AM +00:00
冀崇凛
2023-03-14

您可以使用groupByUntil来实现这一点,从而从本质上消除单个项目的影响

o
  .groupByUntil(x => x, x => x, x => Observable.timer(1000))
  .flatMap(grp => grp.first())
 类似资料:
  • 如果我们发现字符串消息在5秒内连续以字符“a”开头5次,我需要生成CEP事件。 为此,我编写了一个类CEPCharEventPublisher。java,将字符串消息(如下发布的消息)发布到kafka主题“charEvent” 已发布消息: 现在我有一个消费者CEPCharEventConsumer.java它将读取来自Kafka主题charEvent的消息并过滤以字符“a”开头的消息。 然后,我

  • “异常信息” 在WebDriver.dll中发生类型为“System.InvalidOperationException”的未处理异常 附加信息:没有这样的驱动程序(NoSuchDriver) OpenQa.Selenium.edge.EdgedRiver..ctor(字符串edgeDriverDirectory,EdgeOptions选项) ConsoleApplication.Program.

  • 问题内容: 我注意到,每当我的服务器脱机时,只要我将其切换回在线状态,它都会收到大量的套接字事件,这些事件是在服务器关闭时触发的。(现在已过时的事件)。 在x秒钟未收到响应之后,是否有办法阻止socket.io重新发送事件? 问题答案: 当开源库的所有其他功能都失败时,您可以研究代码并找出可以解决的内容。在花了一些时间使用socket.io源代码执行此操作之后… 问题的症结似乎是这样的代码,这里在

  • 我为Handler(Spring Webflow)写了一个测试 但结果我犯了一个错误。 处理程序很简单: 问题出在哪里?如果我直接向服务器发送请求,一切都可以。

  • 我已经设置了Spring的,每小时有一个cron表达式,如下所示,其中为. 这里我的目的是从当前日期和时间中获取小时值,并将其传递给executor方法。 基本上,我取当前小时减去1,所以在17:00,小时值应该是16。 但是如果你看到日志,小时值是15。这是因为调度程序运行16:59:59,831左右。请参阅下面的log4j日志。看起来cron作业正在舍入毫秒,并在17:00:00,000前几毫

  • 情节 所有批处理应用程序(基于Spring批处理)都必须部署到Jboss EAP [Enterprise Workload/Scheduling][Shell脚本] 问题 由于批处理作业是通过HTTPendpoint异步启动的,shell脚本如何获得批处理作业的执行结果