2016-06-27 23 views
0

ich meine Play App habe, und ich will von mir Art von Einzigartigkeit Validierung implementieren, verwende ich Slick, so ist es natürlich, dass ich einen einfachen sum(1) where Anruf tun und wenn die count mehr als Null gesetzt ich den Fehler meines case class object. Also kann ich mir die Problemumgehung nicht vorstellen, um Await.result auf meiner DB-Abfrage zu vermeiden, weil ich den Fehler in der aktuellen Zeit einstellen muss.Wie Avait.result zu vermeiden?

Aber ich jetzt, dass Await.result ist wirklich schlechte Praxis, irgendwelche Vorschläge?

db.run(query.result) map { response => 
    //do whatever you want with the response 
} 

In diesem Fall, dass Sie die Antwort erhalten, aber es blockiert nicht als Await.result ist:

Antwort

2

Sie sollten Karte auf die Zukunft nutzen.

Edit: so für den Code, den Sie in Ihrem Kommentar zeigte, es aussehen würde:

def exists(tableName: String, column: String, value: Any): Future[Boolean] = { 
    val query = dbConfig.db.run(sql"SELECT COUNT(1) from #$tableName WHERE #$column = ${value.toString};".as[Int]) 

    query.map(_.sum > 0) 
} 

Dann, wo Sie exists nennen benötigen Sie

tun
exists(...) map  { result => 
if (result == true) 
    //doSomething 
} 
+0

ja, sicher, aber lassen Sie uns sagen, ich muss Validierung durchführen, wie: Anwesenheitsvalidierung + Anwesenheitsvalidierung + Eindeutigkeit Validierung + Eindeutigkeitsprüfung So kann ich nicht den Weg sehen, diese 'Future' Stuff Kette zu machen Hier sind Die ersten beiden werden 'Boolean' Typ, und wenn ich map verwenden, wird dieser' Future [Boolean] ', ich kann nicht die Lösung für diese – dsounded

+0

In der Karte die Antwort ist nicht von Typ Future [Boolean] aber Boolean. Sie können also alle erforderlichen Prüfungen durchführen und danach einen Future [Boolean] zurückgeben. Poste deinen Code, wenn ich dir eine reale Situation erklären soll. – Simon

+0

https://pastebin.com/ASssHyvN dies ist minimal-Code, der das Problem zeigen sollte, wie Sie aktuelle Implementierung verwendet 'Await.result' sehen – dsounded

Verwandte Themen