如何延迟 POST 发射?

How to have a delay occur POST-emission?

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

即给定计时器或延迟列表 [3, 5, 10],我希望我的可观察对象出现以下时间线:

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

轻松实现

使用zip()是正确的方法。当您想要延迟 after 发出第一个值时,您可以使用 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 毫秒,直到您到达终点。