访问scala期货返回的价值

use*_*249 43 scala future

我是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),你需要决定等待多长时间.

  • 在这种情况下,"无需阻塞线程"意味着"无需等待服务器回复".这怎么可能?如果你不想阻塞线程,你的方法应该返回`Future [Boolean]`. (3认同)

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,你不想阻止正在执行的线程,那么你就可以将处理结果的逻辑移动FutureonComplete方法中,如下所示:

  result.onComplete({
    case Success(listInt) => {
      //Do something with my list
    }
    case Failure(exception) => {
      //Do something with my error
    }
  })
Run Code Online (Sandbox Code Playgroud)

  • 在Scala 2.10中,你应该使用`Await`而不是直接得到未来的结果:`Await.result(结果,10秒)` (13认同)
  • 我的问题是result.onComplete({case Success(listInt)=> {//对我的列表执行某些操作} case Failure(exception)=> {//对我的错误执行某些操作}})将成为某些方法的一部分我想返回listInt值.怎么做 ? (3认同)

小智 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)


Aka*_*all 5

你可以做那样的事情.如果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)