在Controller.await(int millis)之后,操作链不重定向

时间:2011-09-06 14:04:45

标签: playframework continuation async-await

我不确定这是不是按预期工作,只是让我感到困惑。

我想做的是异步延迟一个动作,await(int millis)我似乎能够成为朋友。

以下是发生的事情:

1。 Application.index会显示一个向Application.something发送POST的表单。

应用/控制器/ Application.java

public static void index() {
    render();
}

应用/视图/应用/ index.html中

#{form @Application.something()}
    <input type="submit">
#{/form}

2。 Application.something做了它的事情然后链回到index

应用/控制器/ Application.java

public static void something() {
    await(500);

    // Here be business

    index();
}

3. 播放引发应用程序错误:“模板Application / something.html不存在”

因此,render()中的Application.indexApplication.something中执行后Application.something被暂停/恢复时,会尝试呈现await(500)的模板,当然这不是存在。

如果删除index,一切正常(发布302并按预期呈现redirect("/"); )。

我可以使用

强制重定向
request.action = "Application.index";

并得到我想要的结果,但这感觉很难看。

我也可以设置

await

Application.index之后手动操作,Controller.template()中的渲染工作(实际上,await中的魔法按预期工作)。


所以基本上,一切都还可以,我被迫在{{1}}之后使用字符串而不是方法调用,或者有点不对劲?

干杯, 托拜厄斯。

1 个答案:

答案 0 :(得分:0)

当您调用await()方法时,Play会暂停此HTTP请求。超时后,它再次作为新的HTTPRequest启动,就像再次调用一样。

在第一种情况下,没有await()方法,重定向正确发生 - 这是因为Play框架正确拦截了此方法调用,并且路由器反向路由生成创建了发布302重定向所需的URL 。 (ActionChaining文档中的详细信息)

但是,在第二种情况下,在await()方法之后,创建了一个新的HTTPRequest,并且没有发生动作链接 - 这意味着框架不会拦截对index()方法的调用。这与任何其他方法一样执行,因此您看不到重定向。