gpt4 book ai didi

grails - 在Grails 3.2.4中,具有.async.task调用的 Controller 将request.asyncStarted()设置为true,但不呈现响应

转载 作者:行者123 更新时间:2023-12-02 15:19:03 41 4
gpt4 key购买 nike

首先,在Grails 2.5.4中这不是问题。

我正在对我的Grails Controller 进行 Angular AJAX调用,而Grails Controller 从未响应。前端 call 看起来像这样。

     $http({
method: "GET",
url: actionLink,
params: {}
}).then(function successCallback(response) {

console.log("Yaaay, I got back with some sort of response");
}, function errorCallback(response) {
console.log("ERROR PULLING DETAIL")
});

我已经确认,不调用任何.async.task的其他 Controller 的AJAX调用会立即返回,并且很好。但是,此端点有两个async.task,我可以说在定义第一个async.task后触发asyncStarted标志:
        log.info("ASYNC CHECK-1 - asyncSupported=" + request.asyncSupported + ", asyncStarted=" + request.isAsyncStarted())

def availabilityTask = Item.async.task {

JSON availability = itemService.getItemAvailabilityAsJSON(itemInstance)

availability
}

log.info("ASYNC CHECK-2 - asyncSupported=" + request.asyncSupported + ", asyncStarted=" + request.isAsyncStarted())

第一个request.isAsyncStarted()返回false,第二个返回true。当我完全打开日志记录并在日志中注意到此消息时,我被告知这是一个异步问题:

2017-02-08 18:47:54 DEBUG o.g.web.servlet.mvc.GrailsDispatcherServlet : Leaving response open for concurrent processing



以前在Grails 2.5.4中,我只需要简单地调用AvailabilityTask.get()并使用指定的适当模型和布局来呈现 View 。现在看来,我必须执行此操作才能使响应刷新回前端:
   if (request.isAsyncStarted()) {
final AsyncContext ac = request.asyncContext;
log.info("Calling to complete async request")
ac.dispatch()
}

这似乎很烦人,因为我没有将任何promise或callables传递给模型,而且我已经在检查任务是否完成。我是否遗漏了一些迫使我执行此操作的东西,或者这是预期的且没有充分记录的行为(在Grails文档上关于异步的所有地方都没有提到过,需要调用.dispatch()来刷新异步请求。

更新日期2017年2月10日

我试图将 promise 传递给模型,例如:
        def availabilityTask = Item.async.task {
JSON availability = itemService.getItemAvailabilityAsJSON(itemInstance)

availability
}
render view : "myView", model:[nonAsyncItems, availabilityTask]

认为结果转换器会在模型中检测到Promise,但是没有发生自动调度。我当时想模仿我在Grails异步文档中看到的内容,但是我猜整个模型必须是PromiseMap才能发生自动调度? (当我有一个 Controller 提取同步和异步数据时,这并不理想)

文档部分:
    import static grails.async.Promises.*

def index() {
render view:"myView", model: tasks( one:{ 2 * 2 },
two:{ 3 * 3 } )
}

无论如何,现在看来,我的选择是将带有任何* .async.task的 Controller 包装在较大的任务{}中,或者手动管理调度。

最佳答案

确实,Grails以前没有启动过并异步执行任务请求。此行为是错误的,因为如果任务花费时间,则原始请求可以完成,并在任务有时间完成之前返回线程池,从而导致无法预测的行为和异常。

在Grails 3中,此行为已得到纠正。如果从 Controller 返回由Promise方法创建的task,则Grails将自动为您处理dispatch()的调用。你可以在这里看到这个https://github.com/grails/grails-core/blob/3.2.x/grails-plugin-async/src/main/groovy/org/grails/plugins/web/async/mvc/AsyncActionResultTransformer.groovy#L72

关于grails - 在Grails 3.2.4中,具有.async.task调用的 Controller 将request.asyncStarted()设置为true,但不呈现响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42126047/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com