【问题标题】:Run method async after rendering a page grails 3.1渲染页面grails 3.1后运行方法异步
【发布时间】:2017-10-15 10:21:38
【问题描述】:

在我的 Grails 服务中,我想在 Promise 或某些方法异步运行时呈现页面。我尝试了与文档不同的东西 https://docs.grails.org/3.1.10/guide/async.html。 在调试时,我看到 return 渲染在 promise 之前运行,但是在前端它仍然不会渲染任何东西,直到 promise 完成运行。 我尝试使用承诺和线程。我列出的所有东西都没有按我的意愿工作。 我什至将 saveOrder 复制到 copyOrder,我想也许 promise 会阻止渲染结果。仍然没有工作。

def save(Order order) {   
    def saveorder = orderService.saveOrder(order, user.id)
    def copyOrder=new AppreciationOrder();
    InvokerHelper.setProperties(copyOrder, saveorder.properties)

    response.status = 201
    Promise p = task {
        checkService.checkForDuplicate(saveorder)
        notificationService.newOrder(saveorder)
    }
    p.onComplete { result ->
        println "Promise returned $result"
    }
    return render(view: "/controllers/order/order/_show", model: [order: copyOrder])

}

【问题讨论】:

    标签: grails asynchronous groovy promise


    【解决方案1】:

    尝试重定向而不是渲染,例如以下假设您的保存操作来自订单域:

    redirect( action: 'show', params: [order: copyOrder] )
    

    您可能必须使用上面的参数,例如如果您的表演动作需要一个 ID,您可以这样做:

    redirect( action: 'show', id: copyOrder.id )
    

    我认为您的异步代码最好放在服务中,您也可以添加一个 onError 子句,例如

    p.onError { Exception err ->
        println "Error - $err"
    }
    

    【讨论】:

    • 尝试了您推荐的所有方法,但仍在等待。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2021-05-10
    • 2019-02-03
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    相关资源
    最近更新 更多