【问题标题】:Can grails controller dynamically return an update to a view before the action finishes?grails 控制器可以在操作完成之前动态返回对视图的更新吗?
【发布时间】:2012-03-09 13:21:31
【问题描述】:

现状

我正在执行一个外部应用程序(通过使用Runtime.getRuntime().exec...例如here)并且我正在监听应用程序写入标准输出的流。 该部分按预期工作,我得到了结果(在 grails 控制器中),逐行,因为它们是可用的,并且 - 当流没有更多内容时 - 我在页面上呈现结果.

另一方面是从 gsp 页面异步启动该应用程序。这也已经涵盖,并且调用了 remoteFunction(对上述控制器方法),结果被收集并返回,并且它们正确地显示在页面上的指定区域。


但是,困扰我和我真正想要实现的是:

目标

显示从流中读取的行在读取时,而不是在整个流完成之后(就像现在这样)。

这意味着(例如)为流读取循环中的每一行调用渲染:

while ((line = bri.readLine()) != null) {
  System.out.println(line);
  //render line here?
}

这可以实现吗?

请解释一下:)

【问题讨论】:

  • 你试过你自己的例子吗?
  • 是的。页面只有在控制器方法退出时才会得到响应。
  • 你确定你使用的例子足够大吗?您可以尝试每隔一段时间在输出流上显式调用flush
  • @TedNaleid “模拟器”是一个 DOS 批处理脚本,其中包含 sleep 1 回显几行。 System.out(在流读取器循环中)在出现时打印行。问题是我无法在页面上显示相同的内容,但只有在控制器方法退出后(即当remoteFunction中的onComplete被回调时)

标签: ajax grails


【解决方案1】:

我认为没有标准的 grails 方法可以实现您想要的行为。

g:remoteFunction 仍然是为您包装 AJAX 请求的标签。请求受限于请求响应模式 - 您无法为一个请求获得多个响应。 您的操作代码不会自动修改。

你必须自己实现它。

我会尝试以下方法:

  • 将单个 remoteFunction 调用拆分为多个 AJAX 请求
  • 第一个请求会初始化一个新线程,它会监听您的外部应用程序。
  • 此应用程序的结果必须存储在会话范围中,以便...
  • 来自客户端的以下定期请求可以轮询当前执行状态。

【讨论】:

  • 似乎很明智。今天会试一试,会告诉你的。
  • 它有效。感谢@Aiolos 为我指明了正确的方向:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
相关资源
最近更新 更多