迭代元素和订阅之间的延迟

时间:2016-07-09 03:54:29

标签: java rx-java reactive-programming

FIXED以产生所需的输出!

我有一个项目列表,我需要迭代,并在每个元素之间我想等待2秒。当所有项目都被处理并且订阅被调用时,我想等待另外2秒。

这是我的代码:

rx.Observable.from(new String[] {"Test1", "Test2", "Test3", "Test4"})
        .zipWith(rx.Observable.interval(2000, 1000,TimeUnit.MILLISECONDS), (a,b) -> a)
        .subscribe(name -> {
            System.out.println(name);
        }, e -> {
            System.out.println("ERROR" + e);
        }, () -> {
            rx.Observable.timer(4000, TimeUnit.MILLISECONDS)
                         .subscribe(notUsed -> "THE END!");
        });


        try {
            // Sleep so the program doesn't exit immediately
            Thread.sleep(10000);
        }
        catch (Exception e) {

        }

它运行得非常好,但是当它执行'间隔时,在订阅中它打印" THE END!"三次!

TEST1
TEST2
TEST3
TEST4
THE END!
THE END!
THE END!

知道如何改善这个吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

嗯,它完全按照你的要求去做: - )

 time   event
-------------------------------------
    0   start, wait 2000 ms initially
 2000   emit "Test1", wait 1000 ms
 3000   emit "Test2", wait 1000 ms
 4000   emit "Test3", wait 1000 ms
 5000   emit "Test4", emit the OnCompleted event, wait 2000 ms
 7000   print "THE END!", wait 1000 ms
 8000   print "THE END!", wait 1000 ms
 9000   print "THE END!", wait 1000 ms
10000   main thread dies

我不知道你想要什么,但我认为你只想要一个“THE END!”。如果您希望将此延迟1000毫秒,则必须执行以下操作:

Observable.from(new String[] {"Test1", "Test2", "Test3", "Test4"})
    .zipWith(Observable.interval(2000, 1000,TimeUnit.MILLISECONDS), (a,b) -> a)
    .concatWith(Observable.timer(1000, TimeUnit.MILLISECONDS).ignoreElements())
    .subscribe(
        System.out::println,
        e -> System.out.println("ERROR" + e),
        () -> System.out.println("THE END!));

如果您不希望延迟结束,只需删除上面的concat

concat所做的是等待第一个序列(fromzip)完成,并在Observer之后订阅OnCompleted发出第一个序列。订阅第二个序列后,它等待1000毫秒,发出一个元素并完成(因为它是timer而不是interval)。因为您忽略了元素(例如OnNext s),所以只留下OnCompleted事件,这会触发subscribe中的回调。

答案 1 :(得分:1)

完成第一个流(Test1-4)后,您可以在延迟**$****$****$**

之后使用****$**$**发送单个值进行连接

复制可管理的代码

Observable