无法逃避 Scala 中的嵌套未来?

Cannot escape a nested future in Scala?

我的 Scala 应用程序中有一个嵌套的 future。我知道必须始终有通往 exit/a return 方法的路径 - 我相信这就是阻止这种嵌套未来的原因。

if (validRequest) {
  onComplete("a mongo query happens here") {
    case Success(result) =>
      if (result.isEmpty) {
        if (queryType.equals("id")) {
          onComplete("a different mongo query happens here") {
            case Success(result) =>
              complete(HttpResponse(200))
            case Failure(f) =>
              complete(HttpResponse(500))
          }
        }
      } else {
        complete(HttpResponse(200))
      }

    case Failure(f) =>
      complete(HttpResponse(500))
  }
} else {
  complete(HttpResponse(500))
}

以前,当它不支持 运行 单独的 mongo 查询时,它看起来如下;

onComplete("a mongo query") {
  case Success(result) =>
    complete(HttpResponse(200))
  case Failure(f) =>
    complete(HttpResponse(500))
}

所以,简单多了。然而,由于需要嵌套查询,一切似乎都出了问题。编译器返回的当前错误是;

type mismatch;
[error]  found   : Unit
[error]  required: spray.routing.RequestContext => Unit
[error]                       if (queryType.equals("id")) {
[error]                       ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed

这通常会向我暗示某些东西没有 returning - 即:没有命中 complete() 语句。

有了错误的指针,我唯一能想到的是 switch 语句的结果可能与 Success/Failure 不同,这可能会以 never returning 方法结束.我试图添加一个返回标准 500 错误的 "case _ =>" 段,但无济于事。

我还尝试了一种更简单的方法来设置带有响应 int(200 或 500)的 var,并在最后返回 complete() 响应,包括这个..当然,完整的() 语句被提前命中,并且线程永远不会 return 其结果如预期。

有人可以告诉我解决这个问题的最佳途径是什么吗?

你应该调试它,看看这个异常是在哪里抛出的。据我目前所见:

if (queryType.equals("id")) {
  onComplete("a different mongo query happens here") {
    case Success(result) =>
    complete(HttpResponse(200))
    case Failure(f) =>
    complete(HttpResponse(500))
  }
}

This if 没有 else,所以当这个条件不满足时,你有 Unit。但我很确定你需要调试它

编辑

我注意到你说编译器指示错误。尝试将 else 添加到此 if 中,看看是否有帮助

我成功复制了它

  if (validRequest) {
    onComplete("a mongo query happens here") {
      case Success(result) =>
        if (result.isEmpty) {
          if (queryType.equals("id")) {
            onComplete("a different mongo query happens here") {
              case Success(result) =>
                complete(HttpResponse(200))
              case Failure(f) =>
                complete(HttpResponse(500))
            }
          }
          else {
            complete(HttpResponse(500))
          }
        } else {
          complete(HttpResponse(200))
        }

      case Failure(f) =>
        complete(HttpResponse(500))
    }
  } else {
    complete(HttpResponse(500))
  }

以上代码有效