渲染Iusse,在Grails 2.0.1中使用Async startAsync()

时间:2012-03-28 01:58:13

标签: grails asynchronous render

使用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) 
}

它不能正常工作

2 个答案:

答案 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()
    } 
}