我有下一个代码,返回:
import com.twitter.util.{Future, NonFatal}
import net.liftweb.http.{LiftResponse, OkResponse}
def service(str: Strign) : Future[ValidationNel[String, LiftResponse]] = {
if str == "ok"
Future(OkResponse().successNel[String])
else
Future.value("Invalid string".failureNel[LiftResponse])
}
//and routes for it
serve {
case "user" :: str :: _ Get _ =>
service(str)
}
但是当我跑步时,得到了
No implicit view available from com.twitter.util.Future[scalaz.ValidationNel[String,net.liftweb.http.LiftResponse]] => net.liftweb.http.LiftResponse.
如何将其转换为ListResponse?
答案 0 :(得分:0)
错误基本上表示Lift无法呈现
com.twitter.util.Future[scalaz.ValidationNel[String,net.liftweb.http.LiftResponse]]
(在编译时。)要解决您的问题,您可能需要分解您的任务。首先,找出Lift是否可以呈现“验证”的东西:
scalaz.ValidationNel[String,net.liftweb.http.LiftResponse]
如果不能,那么你将不得不教电梯。因此,您应该使用类型签名ValidationNel[***] => LiftResponse
创建隐式(在范围中可见)。您可以将其转换为Box
,它具有呈现错误的默认方式(空框)。或者您应该使用“if”和2个分支编写自定义代码,其中一个是BadResponse
,另一个是成功。
另一个任务是检查Lift是否知道热来呈现twitter-s Future
- s。同样,您应该创建一个简单的数据并尝试将其渲染出来。像Future(OkResponse())
一样。为了向Lift教授关于twitter Futures,您可能需要再次使用类型签名Future[T] => LiftResponse
来实现隐式。这可能涉及RestContinuation
。
答案 1 :(得分:0)
Lift现在支持LAFuture的异步调用。这是一个示例代码:
case "delay" :: Nil Get _ =>
LAFuture.build({
Thread.sleep(2000)
<b>Hello</b>
})
当您运行它并访问/延迟时,请求将在服务器上异步执行。
当然,您不会在实际代码中显式调用Thread.sleep,这仅用于示例目的。
此示例代码的完整项目位于https://github.com/dpp/lift_30_samples(此处有几个快速修复 - &gt; https://github.com/listatree/lift_30_samples)。
现在关于您尝试执行的转换,我建议您使用Lift的CanBind功能。这里有一个关于它们的示例:https://github.com/fmpwizard/lift_starter_2.4/tree/la-futures-2,它也使用了Lift的LAFuture,但是对它进行了一些转换(顺便说一下,这些转换就像Lift 2.6一样自动进行,所以请使用这个CanBind示例作为参考对于这里讨论的转换)
Lift还支持LAFuture for snippet渲染快速示例:
def render = "*" #> LAFuture.build({
Thread.sleep(2000)
<div>Hello</div>
})
这将使用Lift的Comet基础架构使代码段呈现异步。
此外,您可以使用并行片段,要求您包含与true平行的参数,如下所示:
<div data-lift="HelloWorld.howdy?parallel=true">The time is: <span id="time"></span</div>
并行代码段工作得很好,但它们消耗了宝贵的线程,Lift仍然需要一个解决方案,以便在服务器端实现真正的非阻塞代码段渲染。让我们来看看Lift 3即将发生的事情。