使用servlet 3.0异步方法渲染字符串时没关系,但我们无法渲染页面。
def index() {
def ctx = startAsync()
ctx.start {
do something.........
ctx.complete()
}
render "hello"
}
但是
def index() {
def ctx = startAsync()
ctx.start {
do something.........
ctx.complete()
}
render(view:xxx.page)
}
它不能正常工作
答案 0 :(得分:0)
在同一个问题上我的头撞墙后,我终于找到了解决办法。你想要的代码是:
def index() {
def ctx = startAsync()
ctx.start {
do something.........
ctx.dispatch()
}
render(view:xxx.page)
}
所以,这就是我认为它的工作原理。每次调用ctx.start()都会创建一个新响应。如果使用ctx.complete()关闭AsyncContext,子异步响应将以某种方式合并并替换原始响应,或与其合并。如果使用ctx.dispatch()关闭AsyncContext,则会丢弃子异步响应并使用原始响应。
我认为,我们使用String而不是更高级的渲染行为的原因是Grails中的布局/视图渲染使用了一个特殊的SiteMesh响应对象。当运行ctx.complete()时,新响应属于不同的类,因此它不会进行高级渲染。
答案 1 :(得分:0)
您想调用ctx.dispatch()
来调度视图呈现层而不是ctx.complete()
来完成请求。
http://grails.org/doc/latest/guide/theWebLayer.html#asynchronousRequestProcessing
你想要这样的东西:
def index() {
def ctx = startAsync()
ctx.start {
do something.........
render(view:xxx.page, model: [foo:"bar"])
ctx.dispatch()
}
}