【问题标题】:How to have a delay occur POST-emission?如何有延迟发生 POST-emission?
【发布时间】:2021-03-05 21:44:42
【问题描述】:

我希望我的 Observable 的每个发射在发射后都有延迟。即对于从Observable.fromIterable(listOf(1,2,3)) 发出的每个项目,我想要一个可变/动态延迟之后。

即给定计时器或延迟列表[3, 5, 10],我希望以下时间线与我的 observable 一起出现:

1 -> Wait 3 seconds -> 2 -> Wait 5 seconds -> 3 -> Wait 10 seconds

请注意,这与以下内容不同:

Wait 3 seconds -> 1 -> Wait 5 seconds -> 2 -> Wait 10 seconds -> 3

这可以通过 .zip + .delay 或 Observable.Timer 轻松实现

【问题讨论】:

  • 通过“给定计时器或延迟列表[3, 5, 10]”您是否已经在列表中创建了这些计时器,准备好使用(如何?)或者您只有值并且想要使用他们作为延误?延迟列表和值列表(来自其他可观察到的)是否以某种方式固定和/或提前知道?到目前为止,您尝试过什么?尝试时遇到了什么问题?
  • 是的,该列表是提前知道的。关于我所尝试的,我可以通过滥用订阅块并在那里放置延迟来产生我想要的示例输出,同时递归地进入链中并从以前减少列表。

标签: java rx-java reactivex


【解决方案1】:

使用zip() 是正确的方法。当您希望延迟第一个值发出后,您可以使用startWith() 为第一个组合添加零延迟。代码可能如下所示:

Observable<Integer> values = Observable.fromArray(1,2,3,4,5);
Observable<Long> delays = Observable.fromArray(300L, 400L, 500L, 600L);
    
Observable<Integer> delayedValues = values.zipWith(
    delays.startWith(0L),
    new BiFunction<Integer, Long, Integer>() {
        @Override
        public Integer apply(Integer v, Long d) throws Exception {
            Thread.sleep(d);
            return v;
        }
    }
);
System.out.println("Begin subscribing");
long startTime = System.currentTimeMillis();
delayedValues.subscribe(v -> {
    long currentTime = System.currentTimeMillis();
    long diff = currentTime - startTime;
    System.out.println("["+diff+"] "+v);
});
System.out.println("After subscribing");

这将生成以下输出:

Begin subscribing
[35] 1
[336] 2
[736] 3
[1236] 4
[1836] 5
After subscribing

如您所见,第一个值会立即打印出来,随后会延迟 300 毫秒打印下一个值,直到您到达终点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2010-11-05
    • 1970-01-01
    • 2017-10-05
    相关资源
    最近更新 更多