我是scala期货的新手,我对scala期货的回报价值有疑问.
因此,scala未来的语法通常是
def downloadPage(url: URL) = Future[List[Int]] {
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何访问List[Int]调用此方法的其他方法.
换一种说法,
val result = downloadPage("localhost")
Run Code Online (Sandbox Code Playgroud)
那么List[Int]走出未来的方法应该是什么?
我尝试过使用map方法,但无法成功完成此操作
Ale*_*nov 26
成功的情况(listInt)=>我想返回listInt,我无法弄清楚如何做到这一点.
最佳做法是不返回值.相反,你只是通过未来(或转化的版本map,flatMap等),大家谁需要这个价值,他们可以自己添加onComplete.
如果你真的需要返回它(例如在实现遗留方法时),那么你唯一能做的就是阻塞(例如Await.result),你需要决定等待多长时间.
Noa*_*oah 12
您需要等待将来完成以获得一些时间跨度的结果,这是可行的:
import scala.concurrent.duration._
def downloadPage(url: URL) = Future[List[Int]] {
List(1,2,3)
}
val result = downloadPage("localhost")
val myListInt = result.result(10 seconds)
Run Code Online (Sandbox Code Playgroud)
理想情况下,如果你正在使用a Future,你不想阻止正在执行的线程,那么你就可以将处理结果的逻辑移动Future到onComplete方法中,如下所示:
result.onComplete({
case Success(listInt) => {
//Do something with my list
}
case Failure(exception) => {
//Do something with my error
}
})
Run Code Online (Sandbox Code Playgroud)
小智 6
我希望你已经解决了这个问题,因为它在2013年被问到,但也许我的回答可以帮助其他人:
如果您使用的是Play Framework,它支持异步操作(实际上所有的操作都是异步的).创建异步Action的简单方法是使用Action.async().你需要提供一个Future[Result]这个功能.
现在,你可以让转换从Future[List[Int]]到Future[Result]使用Scala的地图,flatMap,换理解或异步/等待.这是Play Framework文档中的一个示例.
import play.api.libs.concurrent.Execution.Implicits.defaultContext
def index = Action.async {
val futureInt = scala.concurrent.Future { intensiveComputation() }
futureInt.map(i => Ok("Got result: " + i))
}
Run Code Online (Sandbox Code Playgroud)
你可以做那样的事情.如果Await.result方法中给出的等待时间少于awaitable执行的等待时间,则您将拥有a TimeoutException,并且需要处理错误(或任何其他错误).
import scala.concurrent._
import ExecutionContext.Implicits.global
import scala.util.{Try, Success, Failure}
import scala.concurrent.duration._
object MyObject {
def main(args: Array[String]) {
val myVal: Future[String] = Future { silly() }
// values less than 5 seconds will go to
// Failure case, because silly() will not be done yet
Try(Await.result(myVal, 10 seconds)) match {
case Success(extractedVal) => { println("Success Happened: " + extractedVal) }
case Failure(_) => { println("Failure Happened") }
case _ => { println("Very Strange") }
}
}
def silly(): String = {
Thread.sleep(5000)
"Hello from silly"
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58403 次 |
| 最近记录: |