SORU
1 Ocak 2014, ÇARŞAMBA


Scala: [List] Geleceği hiçe sayılarak başarısız vadeli işlemler Listesi[Gelecek]

Bir Liste bir Geleceğe Vadeli keyfi uzunlukta bir liste dönüştürmek için arıyorum. Ben kullanıyorum Playframework, yani sonuçta, asıl istediğim bir Future[Result] ama işin daha basit, diyelim Future[List[Int]] normal olanı bu olurdu Future.sequence(...) ancak bir de twist... liste yapıyorum verilen genellikle 10 ila vadeli ve değil nadir için bir tane vadeli işlem başarısız (çok fazla harici web servis talepleri). Bunlardan biri başarısız hepsini yeniden denemek için olay yerine, başarılı olanları almak ve o geri dönmek mümkün olmak istiyorum.

Örneğin, aşağıdaki şekilde çalışmıyor

import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.Success
import scala.util.Failure

val listOfFutures = Future.successful(1) :: Future.failed(new Exception("Failure")) :: 
                    Future.successful(3) :: Nil

val futureOfList = Future.sequence(listOfFutures)

futureOfList onComplete {
  case Success(x) => println("Success!!! "   x)
  case Failure(ex) => println("Failed !!! "   ex)
}

scala> Failed !!! java.lang.Exception: Failure

Tek istisna almak yerine, oradan 1 ve 3 çekmek mümkün olmak istiyorum. Görünüşe göre sadece kamera arkası Future.sequence çağıran Future.fold ama kullanmaya çalıştım.

Yardım için şimdiden teşekkür ederiz!

CEVAP
1 Ocak 2014, ÇARŞAMBA


Hile ilk vadeli hiçbiri başaramadı emin olmaktır. .recover vadeli işlemler başarılı olmak için her arkadaşın, map Future[Try[T]]] örnekleri Future[T] tüm sonuçları dönüştürmek için birleştirir.

not: Option Either de burada kullanabilirsiniz, ama Try özellikle özel durumları yakalamak istiyorsan temiz bir yoldur

def futureToFutureTry[T](f: Future[T]): Future[Try[T]] =
  f.map(Success(_)).recover(x => Failure(x))

val listOfFutures = ...
val listOfFutureTrys = listOfFutures.map(futureToFutureTry(_))

Sana Future[List[Try[T]]] Bir vermek için önce sonra Future.sequence olarak kullanın

val futureListOfTrys = Future.sequence(listOfFutureTrys)

Sonra filtre:

val futureListOfSuccesses = futureListOfTrys.map(_.filter(_.isSuccess))

Hatta eğer ihtiyacınız varsa belirli hataları çıkar

val futureListOfFailures = futureListOfTrys.map(_.filter(_.isFailure))

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 10 Daughters, 2 Sons

    10 Daughters

    10 Mart 2009
  • FND Films

    FND Films

    2 Mayıs 2006
  • Jejoab

    Jejoab

    4 NİSAN 2008