Oto jest problem, mam bibliotekę, która ma powrót do metody blokowania Spróbuj [T]. Ale ponieważ jest to blokowanie, chciałbym uczynić to bez blokowania za pomocą Future [T]. W przyszłym bloku chciałbym także obliczyć coś, co zależy od wartości zwracanej przez metodę blokowania źródła.Jaki jest najlepszy sposób na blokowanie blokowania Spróbuj [T] w Przyszłości [T] w Scali?
Ale jeśli użyję czegoś takiego jak poniżej, mój nonBlocking
zwróci Future [Spróbuj [T]], który jest mniej przekonany, ponieważ Future [T] może reprezentować Failure [U] już wolałbym propagować wyjątek do Future [T] jest self.
def blockMethod(x: Int): Try[Int] = Try {
// Some long operation to get an Int from network or IO
throw new Exception("Network Exception") }
}
def nonBlocking(x: Int): Future[Try[Int]] = future {
blockMethod(x).map(_ * 2)
}
Oto, co starałem, wystarczy użyć metody .get
w future {}
bloku, ale nie jestem pewien, czy jest to najlepszy sposób, aby to zrobić.
def blockMethod(x: Int): Try[Int] = Try {
// Some long operation to get an Int from network or IO
throw new Exception("Network Exception") }
}
def nonBlocking(x: Int): Future[Int] = future {
blockMethod(x).get * 2
}
Czy to jest właściwy sposób? Lub jest bardziej scala idiomatyczny sposób konwersji t Spróbuj [T] na przyszłość [T]?
Jeśli wiesz, że blokujesz, czy nie powinieneś owijać kodu w 'blokowanie'? –
Czy metoda "fromTry" może być przydatna? http://www.scala-lang.org/api/current/#scala.concurrent.Future$ – stefanobaghino
Samokorygujący mój poprzedni komentarz: 'fromTry' faktycznie blokuje, więc nie ma szczęścia. – stefanobaghino