Java 在Play框架中,方法何时应该返回承诺而不是实际结果?

Java 在Play框架中,方法何时应该返回承诺而不是实际结果?,java,playframework,playframework-2.0,playframework-2.2,Java,Playframework,Playframework 2.0,Playframework 2.2,我对这个框架还比较陌生。我正在处理的当前项目有大量的Promises,这些都是由服务层组件返回到控制器的。我不知道这是不是最好的做法。在我看来,使用Promises确实会弄乱源代码。我不得不频繁地使用final修饰符,只为了让匿名函数可以访问局部变量、参数和类成员,我需要为这些Promise创建。它甚至会影响我创建单元测试用例的方式。老实说,它感觉很难看,而且代码行太多了。我甚至不确定我们是否做对了,我觉得我们过度使用了Promises 顺便说一下,我正在使用Java 那么,我什么时候应该使用承

我对这个框架还比较陌生。我正在处理的当前项目有大量的
Promise
s,这些都是由服务层组件返回到控制器的。我不知道这是不是最好的做法。在我看来,使用
Promise
s确实会弄乱源代码。我不得不频繁地使用final修饰符,只为了让匿名
函数
可以访问局部变量、参数和类成员,我需要为这些
Promise
创建。它甚至会影响我创建单元测试用例的方式。老实说,它感觉很难看,而且代码行太多了。我甚至不确定我们是否做对了,我觉得我们过度使用了
Promise
s

顺便说一下,我正在使用Java


那么,我什么时候应该使用
承诺
,什么时候应该返回
承诺
,什么时候应该不使用
承诺
?我们的所有服务和接口是否都应该返回一个
承诺
?有没有更好的办法?请用通俗易懂的英语。

承诺是在您进行昂贵且相对耗时的操作时使用的。例如,如果您正在对数据库进行密集查询,您不希望让前端用户在收集所有记录时等待

在这种情况下,您将返回一个承诺,而不是结果。这将阻止前端挂起,因为它正在等待密集计算的响应。一旦计算完成,它将收到实际结果

承诺在单独的线程中运行,因此仅在必要时使用它们。在大多数情况下,您只需要使用一个结果

这出戏有好的一页!框架文档包括以下内容:

承诺最终将以Result类型的值赎回。通过使用承诺而不是正常的结果,我们能够在不阻碍任何事情的情况下从行动中快速返回。一旦承诺被兑现,游戏就会产生结果

如果您需要流式传输数据,我还将查看EventSource(用于服务器发送的事件)或WebSocket。我还建议查看Play(2.3)的最新版本,让Java8利用Lambda表达式,这将减少代码的冗长。您可以看一下Typesafe上的一些示例


哦,看起来你确实过度使用了承诺。只有在你进行时间和计算资源都很昂贵的计算时,你才需要承诺。同样,如果您的代码由于匿名内部类和函数而看起来不可读,我强烈建议您升级到Java 8并使用。

尽管这是一个旧线程,但请留下最新版本的响应来澄清注释中的后续问题,即如何在客户端处理Promise响应。使用Play,客户端将保持阻塞状态等待响应,而如果控制器返回承诺,服务器将不会被阻塞I/O。最终,承诺将被兑现,I/O的结果将被返回

…我们能够在不受阻碍的情况下迅速从行动中返回 任何东西一旦承诺兑现,游戏就会产生结果 救赎了

web客户端将在等待响应时被阻止,但 服务器上的任何内容都不会被阻止,服务器资源也可以被阻止 用于服务其他客户


这不只是同步与异步的问题吗?i、 只有当承诺是你所能承受的回报时,你才能回报承诺。lambda表达式似乎没有消除对最终变量的需要,这意味着你只需要在屏幕上保存几个字符。你写下“这将阻止前端挂起”。假设客户机通过HTTP发出请求,我想它无论如何都必须“挂起”,直到收到HTTP响应为止。我的意思是HTTP协议没有任何方式来传达将来响应的承诺,是吗?@nize我不完全确定承诺的内部工作原理,但是可以使用异步AJAX和HTTP调用。HTML5的功能不需要浏览器请求数据,但可以接受传入数据流(服务器发送的事件和WebSocket)。