Wann sollte eine Methode anstelle des tatsächlichen Ergebnisses in Play Framework eine Promise zurückgeben?

8

Ich bin relativ neu in Play Framework. Das aktuelle Projekt, an dem ich gerade arbeite, hat Tonnen von Promise s, die von den Service-Layer-Komponenten bis hin zu Controllern zurückgegeben werden. Ich frage mich, ob das die beste Vorgehensweise ist. Meiner Meinung nach füllt die Verwendung von Promise s die Quellen wirklich auf. Und ich muss zu oft Endmodifikatoren verwenden, um lokale Variablen, Parameter und Klassenmitglieder für anonyme Function zugänglich zu machen, die ich für diese Promise s erstellen muss. Es beeinflusst sogar die Art, wie ich meine Unit-Testfälle erstelle. Es fühlt sich hässlich an und es gibt einfach zu viele Codezeilen als nötig. Ich bin mir nicht einmal sicher, ob wir es richtig machen, ich habe das Gefühl, dass wir Promise s überstrapazieren.

Ich benutze übrigens Java.

Also, wann sollte ich ein Promise verwenden, wann sollte ich ein Promise zurückgeben und wann sollte ich nicht ein Promise verwenden? Sollten alle unsere Dienste und Schnittstellen ein Promise zurückgeben? Gibt es dafür einen besseren Weg? In einfachem Englisch bitte.

    
supertonsky 05.05.2014, 06:13
quelle

2 Antworten

5

Versprechen werden verwendet, wenn Sie eine Operation durchführen, die teuer und relativ zeitaufwendig ist. Wenn Sie beispielsweise eine intensive Abfrage für eine Datenbank ausführen, möchten Sie Ihren Frontendbenutzer nicht warten lassen, während Sie alle Datensätze erfassen.

In solchen Fällen würden Sie anstelle eines Ergebnisses ein Versprechen abgeben. Dies wird verhindern, dass das Front-End hängt, weil es auf eine Antwort für eine intensive Berechnung wartet. Es wird das tatsächliche Ergebnis erhalten, sobald die Berechnung abgeschlossen ist.

Versprechen werden in einem separaten Thread ausgeführt. Verwenden Sie sie daher nur bei Bedarf. In den meisten Fällen müssen Sie nur ein Ergebnis verwenden.

Es gibt eine gute Seite im Spiel! Framework-Dokumentation, die über asynchrone HTTP-Programmierung spricht:

  

Ein Versprechen wird eventuell mit einem Wert vom Typ Ergebnis eingelöst. Indem wir ein Versprechen anstelle eines normalen Ergebnisses verwenden, können wir schnell von unserer Aktion zurückkehren, ohne etwas zu blockieren. Play wird dann das Ergebnis liefern, sobald das Versprechen eingelöst wurde.

Wenn Sie Daten streamen müssen, würde ich auch EventSource (für Server gesendet Ereignisse) oder WebSockets betrachten. Ich würde auch empfehlen, sich die neueste Version von Play (2.3) anzuschauen und Java 8 dazu zu bringen, Lambda Expressions zu nutzen, um die Ausführlichkeit des Codes zu reduzieren. Sie können einige Beispiele auf hier sehen.

Oh, und es sieht aus, als ob Sie Versprechen verwenden. Sie brauchen sie nur, wenn Sie eine Berechnung durchführen, die in Bezug auf Zeit und Rechenressourcen teuer ist. Wenn Ihr Code aufgrund anonymer innerer Klassen und Funktionen nicht lesbar ist, würde ich Ihnen wärmstens empfehlen, auf Java 8 zu aktualisieren und Lambda-Ausdrücke .

    
Melvin Sowah 05.05.2014, 07:23
quelle
3

Obwohl es ein alter Thread ist, lassen Sie die Antwort aus der neuesten Dokumentation von Play, um den Follow-up zu klären Frage in Kommentaren, wie die Promise-Antwort auf Client-Seite behandelt wird. Bei Play bleibt die Clientseite blockiert und wartet auf eine Antwort, während der Server nicht für E / A blockiert wird, wenn der Controller eine Zusage zurückgibt. Schließlich würde das Versprechen eingelöst und das Ergebnis der E / A würde zurückgegeben werden.

  

... wir können schnell von unserer Aktion zurückkehren, ohne zu blockieren   etwas. Das Spiel wird dann das Ergebnis liefern, sobald das Versprechen gegeben ist   eingelöst.

     

Der Webclient wird blockiert, während auf die Antwort gewartet wird, aber   Nichts wird auf dem Server blockiert und Server-Ressourcen können sein   verwendet, um andere Kunden zu bedienen.

    
user1242321 18.05.2016 19:42
quelle