我有一份期货清单,我希望第一个完成一定的条件。 以下是可能代码的示例:
val futureList: Future[List[T]] = l map (c => c.functionWithFuture())
val data = for {
c <- futureList
}yield c
data onSuccess {
case x => (x filter (d=> d.condition)).head
}
但它效率不高,因为我只会选择列表中的一个元素,但会计算所有这些元素的延迟时间。
我知道firstCompletedOf
,但这不是我正在搜索的内容。
(抱歉我的英语不好。)
答案 0 :(得分:2)
一旦满足条件的未来完成,请尝试使用Promise
并在其上调用trySuccess
。第一个调用trySuccess
将完成未来,以下的调用将无效(与调用success
相反,Promise
只能在import scala.concurrent.{ Await, Future, Promise }
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.Random
def condition(x: Int) = x > 50
val futures = (1 to 10) map (x => Future {
// wait a random number of ms between 0 and 1000
Thread.sleep(Random.nextInt(1000))
// return a random number < 100
Random.nextInt(100)
})
val p = Promise[Int]()
// the first one that satisfies the condition completes the promise
futures foreach { _ filter condition foreach p.trySuccess }
val result = p.future
// Watch out: the promise could never be fulfilled if all the futures are <=50
println("The first completed future that satisfies x>50 is: " + Await.result(result, 10.seconds))
上调用一次。)
请注意,如果列表中的未来不满足条件,您永远不会有结果,即承诺未来永远不会完成。
RUN rm -frv /usr/share/nginx/html/*
RUN ls /usr/share/nginx/html/