Bunun yerine aşağıdaki gibi bir anlama için kullanabilirsiniz:
val fut1 = Future{...}
val fut2 = Future{...}
val fut3 = Future{...}
val aggFut = for{
f1Result <- fut1
f2Result <- fut2
f3Result <- fut3
} yield (f1Result, f2Result, f3Result)
Bu örnekte 1, 2 ve 3 vadeli işlemler paralel olarak başlatılır. Daha sonra, anlamak için, 1 ve ardından 2 ve ardından 3 sonuçlarının çıkmasını bekleriz. 1 veya 2 başarısız olursa, artık 3'ü beklemeyeceğiz. 3'ü de başarılı olursa, aggFut
val 3 vadeli işlemin sonuçlarına karşılık gelen 3 yuvalı bir tuple tutacaktır.
Şimdi, önce fut2 başarısız olursa, beklemeyi bırakmak istediğiniz davranışa ihtiyacınız varsa, işler biraz daha karmaşık hale gelir. Yukarıdaki örnekte, fut2'nin başarısız olduğunu fark etmeden önce fut1'in tamamlanmasını beklemeniz gerekir. Bunu çözmek için şuna benzer bir şey deneyebilirsiniz:
val fut1 = Future{Thread.sleep(3000);1}
val fut2 = Promise.failed(new RuntimeException("boo")).future
val fut3 = Future{Thread.sleep(1000);3}
def processFutures(futures:Map[Int,Future[Int]], values:List[Any], prom:Promise[List[Any]]):Future[List[Any]] = {
val fut = if (futures.size == 1) futures.head._2
else Future.firstCompletedOf(futures.values)
fut onComplete{
case Success(value) if (futures.size == 1)=>
prom.success(value :: values)
case Success(value) =>
processFutures(futures - value, value :: values, prom)
case Failure(ex) => prom.failure(ex)
}
prom.future
}
val aggFut = processFutures(Map(1 -> fut1, 2 -> fut2, 3 -> fut3), List(), Promise[List[Any]]())
aggFut onComplete{
case value => println(value)
}
Şimdi bu doğru çalışıyor, ancak sorun, başarıyla tamamlandığında hangisinin Future
kaldırılacağını bilmekten kaynaklanıyor Map
. Bir sonucu ortaya çıkaran Gelecek ile bir sonucu doğru bir şekilde ilişkilendirmek için bir yolunuz olduğu sürece, bunun gibi bir şey çalışır. Tamamlanan Vadeli İşlemleri tekrar tekrar Haritadan kaldırmaya devam eder ve ardından Future.firstCompletedOf
kalan Futures
kısmı kalmayana kadar çağırarak yol boyunca sonuçları toplar. Hoş değil, ama gerçekten bahsettiğiniz davranışa ihtiyacınız varsa, o zaman bu veya benzeri bir şey işe yarayabilir.