Đây là vấn đề, tôi có một thư viện có phương thức chặn trả về Thử [T]. Nhưng vì nó là một ngăn chặn, tôi muốn làm cho nó không bị chặn bằng cách sử dụng Future [T]. Trong khối tương lai, tôi cũng muốn tính toán điều gì đó phụ thuộc vào giá trị trả về của phương thức chặn gốc.Cách tốt nhất để bọc chặn Hãy thử [T] trong tương lai [T] trong Scala là gì?
Nhưng nếu tôi sử dụng một cái gì đó như dưới đây, thì nonBlocking
của tôi sẽ trả về Tương lai [Thử [T]] ít thuyết phục hơn vì Future [T] có thể đại diện cho Failure [U], tôi thà tuyên truyền ngoại lệ cho tương lai [T] là tự.
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)
}
Dưới đây là những gì tôi cố gắng, tôi chỉ sử dụng .get
phương pháp trong future {}
khối, nhưng tôi không chắc chắn nếu điều này là cách tốt nhất để làm điều đó.
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
}
Đây có phải là cách chính xác để làm điều đó không? Hoặc có một cách scala thành ngữ hơn để chuyển đổi t Thử [T] thành Tương lai [T]?
Nếu bạn biết mình đang chặn, bạn có nên quấn mã trong 'chặn' không? –
Phương thức 'fromTry' có hữu ích cho việc này không? http://www.scala-lang.org/api/current/#scala.concurrent.Future$ – stefanobaghino
Tự sửa lại nhận xét trước của tôi: 'fromTry' thực sự chặn, vì vậy không may mắn ở đó. – stefanobaghino