gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:25:27 25 4
gpt4 key购买 nike

已修复以产生所需的输出!

我有一个需要迭代的项目列表,并且在每个元素之间我想等待 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!

知道如何改进吗?

谢谢!

最佳答案

嗯,它完全按照你的指示去做:-)

 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 毫秒,发出一个元素并完成(因为它是一个计时器,而不是间隔)。因为您忽略了这些元素(也称为 OnNext),所以您只剩下 OnCompleted 事件,该事件会触发 subscribe 中的回调。

关于java - 迭代元素之间和订阅时的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38278132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com