Action如何在Play框架中运行

时间:2014-01-24 22:06:47

标签: scala playframework functional-programming

如果我理解正确

    object Application extends Controller {
    def page1 = Action { Ok("Hello") } 
    }

可以写成

    object Application extends Controller {
    val f : Result = { Ok("Hello") }
    def page1 = Action( f )
    // i.e. Action.apply( f )
    }

documentation表示操作本质上是一个(Request [A] => Result)函数,它处理请求并生成要发送给客户端的结果。

由于Action本质上是一个函数,我们可以将函数f应用于Action,即Action.apply(f)。希望我到目前为止是正确的。

现在提供以下代码,

    def index = Action { implicit request =>
    Async {
      val cursor = collection.find(
        BSONDocument(), BSONDocument()).cursor[Patient] 
        val futureList = cursor.toList 
        futureList.map { patients => Ok(Json.toJson(patients)) } 
      }
    }

如果我要写

    def index = Action(f)

我希望能够写一个函数f。我的伪代码是

    val f: Result = 
      //a function that takes Request[A] and returns Result
      {
        (request :Request[A]) => 
            Async {
              val cursor = collection.find(
                BSONDocument(), BSONDocument()).cursor[Patient] 
              val futureList = cursor.toList 
              futureList.map { patients => Ok(Json.toJson(patients)) } 
            }
      }

我仍然在努力让这项工作得以实现。编写函数的任何帮助都会有所帮助。

2 个答案:

答案 0 :(得分:2)

当f ResultRequest[_] => Result时,您的类型为val f: Request[_] => Result = request => Async { val cursor = collection.find( BSONDocument(), BSONDocument()).cursor[Patient] val futureList = cursor.toList Ok(Json.toJson(futureList )) } }

f的正确版本如下:

Request[_]

请注意futureList不能包含泛型类型参数。要使Request是通用的,f必须是def而不是val。

此外,如果Result是一个列表,那么地图将生成一个Result而不是一个{{1}}的列表。假设您想要光标中所有患者的JSON列表,我做了更正。

答案 1 :(得分:0)

感谢您的回复。我用了

    val f: Request[_] => Result = 
      //a function that takes Request[A] and returns Result
      {
         (request : Request[_]) => 
            Async {
              val cursor = collection.find(
                BSONDocument(), BSONDocument()).cursor[Patient] 
              val futureList = cursor.toList 
              futureList.map { patients => Ok(Json.toJson(patients)) } 
            }
      }

希望这是写入f的正确方法,它接受一个Request [_]并返回一个Result。