Playframework 在Play框架中,何时使用承诺来处理请求,何时不使用承诺?

Playframework 在Play框架中,何时使用承诺来处理请求,何时不使用承诺?,playframework,playframework-2.0,Playframework,Playframework 2.0,据我所知,这可能是错误的,Play框架通过异步方式处理请求是非阻塞的,长阻塞操作应该使用承诺异步完成。那么,什么时候应该使用承诺或映射承诺来处理给定的请求,什么时候不应该 例如,假设用户上载了一个文件,当它到达控制器时,我将该文件从临时文件夹移动到所需文件夹,并插入数据库记录。这涉及到两个阻塞操作,文件移动和插入到数据库。假设文件不大,比如说最大10MB,那么文件移动速度应该相当快。插入一个db记录应该也很快,并且有一个阻塞的数据库驱动程序 在这个简单的例子中,我应该使用一个promise/fu

据我所知,这可能是错误的,Play框架通过异步方式处理请求是非阻塞的,长阻塞操作应该使用承诺异步完成。那么,什么时候应该使用承诺或映射承诺来处理给定的请求,什么时候不应该

例如,假设用户上载了一个文件,当它到达控制器时,我将该文件从临时文件夹移动到所需文件夹,并插入数据库记录。这涉及到两个阻塞操作,文件移动和插入到数据库。假设文件不大,比如说最大10MB,那么文件移动速度应该相当快。插入一个db记录应该也很快,并且有一个阻塞的数据库驱动程序

在这个简单的例子中,我应该使用一个promise/future来执行2个操作还是使用2个映射的promise(移动文件,然后插入db记录),还是根本不使用promise?为什么

请分享你的想法/经历。
提前感谢您。

这实际上是一条很好的界线,决定什么将进入未来,什么不会完全依赖于应用程序

一般来说,您不必担心将来会调用数据库。因为底层驱动程序是阻塞的,所以您将在某处阻塞,即使您将其放在未来或参与者中。所以:尽量减少db延迟。确保您的数据库离您很近(从网络拓扑上讲),并且有足够的资源

以非阻塞方式移动文件可以通过以下方式进行非常简单的处理:

def uploadFile()=操作{
异步的{
//处理文件移动
好啊
}
}
但是,假设您仍然需要处理两件昂贵的文件。如果一个动作依赖于另一个动作,那么你可以随心所欲地组织它(在一个未来是完全可以的)。在开始第二项任务之前,你必须先完成第一项任务。然而,使用两个未来,代码可能是最干净的。高层次,类似于:


对于{movedFile,感谢安德鲁的清晰解释,这对我来说很有意义。