Tôi đang tìm cách chuyển đổi danh sách Hợp đồng tương lai có độ dài tùy ý thành Danh sách tương lai. Tôi đang sử dụng Playframework, vì vậy cuối cùng, những gì tôi thực sự muốn là một Future[Result]
, nhưng để làm cho mọi thứ đơn giản hơn, hãy nói Future[List[Int]]
Cách thông thường để làm điều này là sử dụng Future.sequence(...)
nhưng có một chút thay đổi ... Danh sách tôi đưa ra thường có khoảng 10-20 hợp đồng tương lai trong đó, và không có gì lạ khi một trong những hợp đồng tương lai đó không thành công (họ đang thực hiện các yêu cầu dịch vụ web bên ngoài). Thay vì phải thử lại tất cả chúng trong trường hợp một trong số chúng không thành công, tôi muốn có thể lấy những cái đã thành công và trả lại những cái đó.
Ví dụ, làm như sau không hiệu quả
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
Thay vì nhận được ngoại lệ duy nhất, tôi muốn có thể kéo 1 và 3 ra khỏi đó. Tôi đã thử sử dụng Future.fold
, nhưng đó dường như chỉ là các cuộc gọi Future.sequence
đằng sau hậu trường.
Xin được cảm ơn trước về sự giúp đỡ!
.recover
thực sự là mảnh ghép còn thiếu đối với tôi.