2017-02-07 8 views
3

В приведенном ниже коде я должен вернуть результат будущего, который вызывается после другого будущего. Я получаю следующую ошибку в строке future2.map:Возвращение будущего будущего в игре для Scala

тип несоответствие; найдено: scala.concurrent.Future [play.api.mvc.Result] требуется: play.api.mvc.Result

Как сделать эту работу?

def method1 = Action.async { request => 
    val future1 = f1 
    future1.map { result1 => 
      val future2 = f2 
      future2.map { result2 => 
       Ok(result1+result2+"") 
      } 
    } 
} 

def f1 = Future { 1 } 
def f2 = Future { 2 } 

ответ

4

Вы могли бы сделать это разными способами. Но во-первых, вы должны понять, как map и flatMap работа с Future:

def map[S](f: (T) ⇒ S): Future[S] 
def map[S](f: (T) ⇒ Future[S]): Future[Future[S]] 
def flatMap[S](f: (T) ⇒ Future[S]): Future[S] 

Обратите внимание, что в вышеуказанных подписей, вы вызываете map и flatMap со значением, already is a future т.е. Future[<some-value>].map(...) или Future[<some-value>].flatMap(...).

Подход 1:

def method1 = Action.async { request => 
    val future1 = f1 
    future1.flatMap { result1 => //replaced map with flatMap 
     val future2 = f2 
     future2.map { result2 => 
     Ok(result1+result2+"") 
     } 
    } 
    } 

    def f1 = Future { 1 } 
    def f2 = Future { 2 } 

Подход 2:

def method1 = Action.async { request => 
    val future1 = f1 
    future1.flatMap { result1 => //replaced map with flatMap 
     val future2 = f2 
     future2.flatMap { result2 => //replaced map with flatMap 
     Future.successful{Ok(result1+result2+"")} // used Future.successful{} to generate a Future of Result 
     } 
    } 
    } 

    def f1 = Future { 1 } 
    def f2 = Future { 2 } 
+1

подход 2 добавляет ненужный уровень сложности, окружая результат в успешной 'Future'. Хотя вы не можете этого сделать, нет абсолютно никаких оснований предпочитать этот первый. – Eric

+0

Да, согласен. Я пытался проиллюстрировать различные способы работы «map» и «flatMap» с будущим. И 'Future.successful()' неизбежно, когда нам приходится обрабатывать несколько случаев внутри будущих вычислений, где один случай возвращает 'Future (value)' ' и другой случай возвращает значение 'значение'. – oblivion

3

Изменение future1.map к future1.flatMap должен сделать трюк. Сопоставление по Future возвращает другой Future и изменяет значение внутри. В этом случае вы возвращаете Future, который содержит другойFuture, который содержит Result. Используя flatMap, он по существу сглаживает вложенный Future[Future[Result]] в Future[Result].

 Смежные вопросы

  • Нет связанных вопросов^_^