如何在RxJava中延迟从Collection中发出项目?

时间:2014-08-06 10:39:49

标签: groovy rx-java

我有以下代码从集合中发出项目。

// fills the given coll with some items and
// returns the observable emitting the filled collection
// does ASYNC work
Observable<Collection> generate(Collection coll){ ... }

def coll = []
generate(coll).flatMap({ filledColl ->
    rx.Observable.from(filledColl)
}).subscribe({ ... })

问题是这个集合可以包含数千个项目,并且由于generate工作异步,这个代码会导致订阅方法几乎立即被调用数千次(这对我的工作来说是不可取的。在观察者内部做。)

如何修改此代码以延迟从集合中发出项目? 例如:发出100个项目然后等待100ms然后再发出100个项目或等待10ms然后再发出下一个项目?

1 个答案:

答案 0 :(得分:2)

在flatMap中,你需要将filledColl拆分成更小的部分,延迟每个部分,并将它们全部合并到一个observable中,你将在flatMap内返回。

generate(coll).flatMap({ filledColl ->
    def chunkSize = 100
    resultStream = rx.Observable.never()
    for (i in 0 ..< filledCol.size()/chunkSize) {
        def chunk = filledCol[i*chunkSize .. (i+1)*chunkSize]
        resultStream = resultStream.mergeWith(
            rx.Observable.from(chunk).delay(100*i, TimeUnit.MILLISECONDS)
        )
    }
    resultStream
}).subscribe({ ... })

这只是一个粗略的想法,你可能仍然想根据你的需要进行测试,调整和纠正。此外,将它移动到generate函数可能更有意义,但这取决于你,因为我不知道generate()中有什么。