liftweb SetHtml无法处理ajaxsubmit中的未来对象

时间:2014-05-07 16:03:48

标签: lift futuretask

我想在一个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  }

SetHtmlonSuccess内无效,但我在那里得到了json。 SetHtmlfollowing doc

  

使用标记替换提供的id的节点内容   由内容给出

     

这类似于为DOM对象的innerHtml分配新值   Javascript中的属性。

我在github.

上提供了所有这些应用

我想要的是解决SetHtml处理请求本身是通过ajax的未来对象的问题。

1 个答案:

答案 0 :(得分:1)

SetHtml返回JsCmd,但为了将其发送到浏览器,它需要成为服务器响应的一部分。但是,当您异步调用它时,没有响应发送它,因此浏览器永远不会收到它。要解决这个问题,您有两种选择:

  1. 等待未来通过阻止完成,就像拥有一样 你的函数返回future.get
  2. 使用允许与浏览器进行服务器推送通信的actor。这样,您的未来可以在完成后向演员发送消息,然后演员将发送setHtml命令。
  3. 这里有一个关于Lift actor的快速示例(不幸的是在渲染中使用了旧的绑定语法),它说明了如何发送消息并执行setHtmlhttps://www.assembla.com/wiki/show/liftweb/Comet_Support