我想在一个liftweb框架中显示UI的未来响应。
以下是Loggable
代码段方法(processRequest
)我目前正在使用使用textarea
将未来对象回复给用户界面SetHtml
但阻止了Thread.sleep
27 def render = {
45 def processRequest() : JsCmd = {
46
47 val future_ : LAFuture[String] = new LAFuture()
48
49 val urlRequest = url(request)
51 val future = Http(urlRequest OK as.String)
57
58 future onSuccess {
59 case json =>
60 resp = json
61 logger.info(s"[onSuccess] response => ${json}")
62 SetHtml("response", Text(resp+"")) //FIXME
63 logger.info(s"[onSuccess] response => ${json}") //works fine
64
65 }
66
67 future onFailure {
68 case exception =>
69 logger.info(s"${exception.getMessage()}")
70 }
71 Thread.sleep(2000) //TEMPORARY FIX
72 logger.info("[outside] response => ${resp}")
73 SetHtml("response", Text(resp)) //it works in blocking mode
74 }
77 "@requestid" #> text(requestid, s => requestid = s) &
78 "@request" #> text(request , s => request = s) &
79 "@response" #> textarea(responseString, s=>responseString = s) &
81 "@processreq" #> ajaxSubmit("Send Request", processRequest)
75 }
SetHtml
在onSuccess
内无效,但我在那里得到了json。 SetHtml
有following doc,
使用标记替换提供的id的节点内容 由内容给出
这类似于为DOM对象的innerHtml分配新值 Javascript中的属性。
我在github.
上提供了所有这些应用我想要的是解决SetHtml
处理请求本身是通过ajax的未来对象的问题。
答案 0 :(得分:1)
SetHtml
返回JsCmd
,但为了将其发送到浏览器,它需要成为服务器响应的一部分。但是,当您异步调用它时,没有响应发送它,因此浏览器永远不会收到它。要解决这个问题,您有两种选择:
future.get
setHtml
命令。这里有一个关于Lift actor的快速示例(不幸的是在渲染中使用了旧的绑定语法),它说明了如何发送消息并执行setHtml
:https://www.assembla.com/wiki/show/liftweb/Comet_Support