无法逃避 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))
}
以上代码有效
我的 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))
}
以上代码有效