eaを処理したいです。クエリ フェッチ (クエリごとに複数のフェッチが行われる可能性があります) を非同期的に行います。これを行うために、処理関数 ( a を返すFuture
) をクエリ メソッドに渡して、それを呼び出します。フェッチ。クエリの結果サイズは事前にわかりません。フェッチの最大サイズしか知りません。したがって、私のクエリは(事前にサイズを知る必要がObservable
ある for ex. とは対照的に) を返します。List
唯一の問題は、Observable
create
orを使用すると、次の onNext を呼び出す前にapply
、 my が完了するまで内部的にブロックされることです。事実上、先物から得たいと思っていたパフォーマンスの向上が失われます。Future
ファクトリ メソッドはObservable
from
ブロックしませんが、Iterable
. 私はそれをミュータブルに渡すことができますIterable
新しいフェッチが入ると成長します。誰かがより参照透過的なsol'nを持っていますか? コードは次のとおりです。
object Repository {
def query(fetchSize: Int)(f: Set[Int] => Future[Set[Int]]): Observable[Future[Set[Int]]] = {
// observable (as opposed to list) because modeling a process
// where the total result size is unknown beforehand.
// Also, not creating or applying because it blocks the futures
val mut = scala.collection.mutable.Set[Future[Set[Int]]]()
val obs = Observable.from(mut)
1 to 2100 by fetchSize foreach { i =>
mut += f(DataSource.fetch(i, fetchSize))
}
obs
}
}