1

我想在 Liftweb 框架中的 UI 中显示未来的响应。

以下是一个Loggable片段方法(processRequest),我目前正在使用它来响应未来对象到 UI ,但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以下文档

将节点的内容替换为提供的 id 和 content 给出的标记

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

我在github 上提供了所有这些应用程序。

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

4

1 回答 1

1

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

  1. 等待未来通过阻塞完成,比如让你的函数返回future.get
  2. 使用允许与浏览器进行服务器推送通信的参与者。这样,您的未来可以在完成后向演员发送消息,然后演员将发送setHtml命令。

这里有一个 Lift actor 的快速示例(不幸的是在渲染中使用了旧的绑定语法),它说明了如何发送消息并执行setHtmlhttps ://www.assembla.com/wiki/show/liftweb/Comet_Support

于 2014-05-08T12:08:21.243 回答