【问题标题】:How to return future from a function如何从函数返回未来
【发布时间】:2015-03-10 08:37:19
【问题描述】:

我正在使用 scala 的 Dispatch 库从 API 获取数据。

在 main 中,我有一个函数 getSensorList(),它返回附加到设备 ID 的传感器列表。

Dispatch 使用 Futures 做一个请求Dispatch library

我如何将未来返回主?

我按照这篇文章来实现我所拥有的:Accessing value returned by scala futures

import dispatch._, Defaults._
import scala.util.{Success, Failure}
import scala.concurrent.duration._

def getSensorList(uuid:String) = Future[String] {

val svc = url("https://example_api.com/services/api/v1/sensors/" + uuid + "/")

val response : Future[String] = Http(svc OK as.String)

}

object DispatchTestFunction{

def main (args: Array[String]) {

val result = getSensorList("example_device_ID)

result onComplete {
  case Success(content) => {
    println("Successful response" + content)
  }
  case Failure(t) => {
    println("An error has occurred: " + t.getMessage)
  }
}
}
}

感谢您的帮助。

API 返回 JSON 类型的数据,因此 result 应该是 JSON 类型吗?

我的代码错误是Type mismatch, expected string: actual is unit

我将 future 的返回类型定义为字符串,但编译器查看函数的最后一行并认为它应该是 unit 类型 - 即它返回 notting?

谢谢

import dispatch._, Defaults._
import scala.util.{Success, Failure}


def getSensorList(uuid:String) = Future[String] {

val svc = url("https://example_api.com/services/api/v1/sensors/" + uuid + "/")

val response : Future[String] = Http(svc OK as.String)

}

object DispatchTestFunction{

def main (args: Array[String]) {

val result = getSensorList("example_device_ID")

  result onComplete {
  case Success(content) => {
    println("Successful response" + content)
  }
  case Failure(t) => {
    println("An error has occurred: " + t.getMessage)
  }
}
}
}

【问题讨论】:

  • (如果您发布代码以检查存在类型推断的语言,请至少将推断的类型添加到问题的部分,在这种情况下为result。)你如何想要在main 中获得Future?对我来说,你似乎已经拥有它了。不确定你想达到什么目标。你想Await结果吗?还是map
  • 感谢您对 Gabor 的帮助。 API 返回 JSON 数据,因此 result 应该是 JSON 类型吗?这在 Scala 中是否存在。
  • 这取决于 lib 调度程序使用。我猜结果类型类似于val result: Future[/*List[*/JValue/*]*/] = ...。 IDE 或 REPL 可以判断。对于 akka/Scala Future,您可以通过 Await 获得结果(docs.scala-lang.org/overviews/core/futures.html#blocking),如果您希望将其保存在 Future 中,只需将 mapresult 保存在其他位置即可。

标签: scala future


【解决方案1】:

看来我误解了你的问题。现在看来您对getSensorList 有问题,而不是如何处理结果。

这是我的看法:

def getSensorList(uuid:String): Future[String] = {
    val svc = url("https://example_api.com/services/api/v1/sensors/" + uuid + "/")
    val response : Future[String] = Http(svc OK as.String)
    response
}

我保留了response 变量,以防您想在返回之前进行调试或进一步处理。问题是您刚刚声明了要返回的结果,但没有返回。 (= 返回 Unit,在 Scala 中,赋值不返回右侧表达式。)如果您熟悉 Java,您是对的,Unit 什么都不是(但不是Nothing!) /C/C++/C#,相当于void(在Python中我认为是None)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2018-07-23
    相关资源
    最近更新 更多