1

liftweb フレームワークの UI で将来の応答を表示したい。

以下はLoggableスニペットmethod ( )processRequestですtextareaSetHtmlThread.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を取得しますが、内部では機能しません。次のドキュメントSetHtmlがあります。

指定された ID を持つノードのコンテンツを content によって指定されたマークアップに置き換えます

これは、Javascript で DOM オブジェクトの innerHtml プロパティに新しい値を割り当てることに似ています。

このアプリはすべてgithub で入手できます。

私が欲しいのはSetHtml、リクエスト自体がajaxを介して行われる将来のオブジェクトを処理する際の解決策です。

4

1 に答える 1

1

SetHtmlを返しますがJsCmd、それをブラウザに送信するには、サーバー応答の一部である必要があります。ただし、非同期で呼び出しているため、送信する応答がないため、ブラウザーはそれを受信しません。これを修正するには、次の 2 つのオプションがあります。

  1. 関数が返されるように、未来がブロックして終了するのを待ちますfuture.get
  2. ブラウザとのサーバー プッシュ通信を可能にするアクターを使用します。そのようにして、Future は完了時にアクターにメッセージを送信し、アクターはsetHtmlコマンドを送信します。

ここに Lift アクターの簡単な例があります (残念ながらレンダリングで古いバインド構文を使用しています)。これは、メッセージを送信してそれを実行する方法を示していますsetHtml: https://www.assembla.com/wiki/show/liftweb/Comet_Support

于 2014-05-08T12:08:21.243 に答える