2017-03-09 1 views
0

J'ai un avenir imbriqué dans mon application Scala. Je suis conscient qu'il doit toujours y avoir un chemin vers la sortie/une méthode de retour - et je crois que c'est ce qui empêche cet avenir imbriqué.Vous ne pouvez pas échapper à un avenir imbriqué à Scala?

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)) 
} 

Auparavant, lorsque cela ne permettait pas l'exécution d'une requête mongo distincte, il ressemblait à ceci;

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

Donc, beaucoup plus simpliste. Cependant, avec le besoin de la requête imbriquée, tout semble avoir mal tourné. L'erreur actuelle renvoyée par le compilateur est;

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 

Cela me suggérer normalement que quelque chose ne revient pas - i.e.: une déclaration complète() n'est pas touché. Avec le pointeur sur l'erreur, la seule chose que je pourrais imaginer est que l'instruction switch pourrait avoir un résultat différent de Success/Failure, ce qui pourrait potentiellement se terminer avec la méthode ne retournant jamais. J'ai essayé d'ajouter un segment "case _ =>" qui a renvoyé l'erreur standard 500, mais en vain. J'ai également essayé une façon plus simple de définir a var avec la réponse int (200 ou 500), et de rejeter la réponse complete() à la fin, y compris celle-ci .. mais bien sûr, la complète () L'instruction est touchée rapidement et les threads ne renvoient jamais leurs résultats comme prévu.

Quelqu'un pourrait me conseiller sur ce que la meilleure voie à suivre pour résoudre ce problème est?

Répondre

2

Vous devez le déboguer et regarder où cette exception est levée. De ce que je vois pour l'instant:

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

Ce ne si pas d'autre, donc lorsque cette condition ne soit pas remplie, vous avez l'unité. Mais je suis sûr que vous avez besoin de déboguer

Modifier

J'ai remarqué que vous avez dit que le compilateur indique une erreur. Essayez d'ajouter d'autre à cela si et voir si cela aide

j'ai réussi à le reproduire

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)) 
    } 

code ci-dessus fonctionne

+0

Une autre pendaison si/déclaration d'autre. Merci beaucoup pour l'aide! – Eoghan