0

これを達成しようとしています:

REST API への HTTP リクエスト -> 解析 -> 別の API への非同期呼び出しを作成 -> 非同期呼び出しの結果で http req に応答します。

現在、コードは次のようになっています。

 def getItems(param: String): LiftResponse = {

    @volatile var resp: LiftResponse = new BadResponse

    param.toLowerCase match {
      case "something" =>
        val req = Async call returning a Future
        req onSuccess {
          case items =>
            resp = new JsonResponse(items map (decompose(_)), S.getResponseHeaders(Nil), S.responseCookies, 200)
        }
        req onFailure {
          case fail => resp = new BadResponse
        }
        resp

      case _ => new OkResponse
    }
  }

しかし、それは貧弱な実装のようです。

上記を書くための慣用的な Scala の方法は何ですか?

4

4 に答える 4

4

null を返すか他の何かを返すかはスケジューリングに依存するため、コードはおそらく期待どおりに動作しません。LiftResponse は厳格な値ですか、それとも延期できますか? 厳密な場合は、 をFuture[LiftResponse]マッピングして取得した を返す必要がありますreq: Future

于 2013-08-06T06:12:42.237 に答える
4

LiftRestHelperを と組み合わせて使用​​することを検討してくださいRestContinuation.async。継続を使用して、データが利用可能になるまでリクエストを中断することをサポートします。http://demo.liftweb.net/async_restにサンプル コードがあります。非同期継続が呼び出された後、reply関数が結果で呼び出される前に、要求スレッドがスレッド プールに解放されます。関数が呼び出されると、replyリクエストはスレッドに戻され、レスポンスがクライアントに送信されます。

于 2013-08-08T19:24:05.183 に答える
0

注 (3 年後):最近 (2016 年 11 月) にリリースされた Lift3 では、 Piotr Dyragaの「 Request and Session Access in Lift Futures」でnet.liftweb.http._説明されているように、 を使用できます。

例として、ユーザーのリストを遅延レンダリングしたいとします。
まず、データベース クエリを非同期で実行Future[Seq[User]]し、この操作の結果として取得します。
Lift 2 を使用している場合は、以前の投稿FutureBindsで説明したことを組み込むか、Lift3 を使用している場合は、インポートして実行します。net.liftweb.http._

val allUsers: Future[Seq[User]] = ... // retrieve users from DB

".user-list-async-container" #> allUsers.map { users =>
  ".user-list" #> users.map { user =>
    ".user" #> userBindings(user)
  }
}
于 2016-12-10T22:25:38.800 に答える