2015-04-16 3 views
1

Когда у меня есть следующий код, все компилируется в порядке.перегруженное значение метода async с альтернативами:

def create(name: String, age: Int) = Action.async { 
    val json = Json.obj(
     "name" -> name, 
     "age" -> age, 
     "created" -> new java.util.Date().getTime()) 

    collection.insert(json).map(lastError => 
     Ok("Mongo LastError: %s".format(lastError))) 
    } 

Но когда экстракт содержание другой метод следующим

def create(name: String, age: Int) = Action.async { 
    createPerson(name,age) 
} 

    def createPerson(name: String, age: Int) = Action.async { 
    val json = Json.obj(
     "name" -> name, 
     "age" -> age, 
     "created" -> new java.util.Date().getTime()) 

    collection.insert(json).map(lastError => 
     Ok("Mongo LastError: %s".format(lastError))) 
    } 

это дает ошибку

[error] /media/pubudu/NTFSPartition/projects/catnet/data-collector-backend/app/controllers/Application.scala:50: overloaded method value async with alternatives: 
[error] [A](bodyParser: play.api.mvc.BodyParser[A])(block: play.api.mvc.Request[A] => scala.concurrent.Future[play.api.mvc.Result])play.api.mvc.Action[A] <and> 
[error] (block: play.api.mvc.Request[play.api.mvc.AnyContent] => scala.concurrent.Future[play.api.mvc.Result])play.api.mvc.Action[play.api.mvc.AnyContent] <and> 
[error] (block: => scala.concurrent.Future[play.api.mvc.Result])play.api.mvc.Action[play.api.mvc.AnyContent] 
[error] cannot be applied to (play.api.mvc.Action[play.api.mvc.AnyContent]) 
[error] def create(name: String, age: Int) = Action.async { 

это не два кодовых секций делают то же самое? Если нет, как я могу извлечь содержимое метода без получения ошибки? Я хочу сделать вызов извлеченного метода из двух разных мест.

+1

Нет, метод создания ожидает возвращение быть результатом, но вы вызываете другое действие в этой функции, которая имеет возвращения действие [AnyContent] – curious

+0

@curious Спасибо, И.Ф. вы можете сделать этот ответ, я могу его принять. –

+0

Я объяснил это еще немного. Проверь это. – curious

ответ

3

Метод create ожидает, что тип возврата будет Future[Result], но вызов createPerson возвращает Action[AnyContent]. Вы можете это исправить, сделав следующие изменения:

def create(name: String, age: Int) = Action.async { 
    createPerson(name,age).map(lastError => 
     Ok("Mongo LastError: %s".format(lastError))) 
} 

    def createPerson(name: String, age: Int):Future[String] = { 
    val json = Json.obj(
     "name" -> name, 
     "age" -> age, 
     "created" -> new java.util.Date().getTime()) 

    collection.insert(json) 
    }