2015-10-09 11 views

回答

5

可以使用flatMap代替第一map

for { 
    album <- repo.lookup(id) 
    musics <- musicRepo.fromAlbum(id) 
} yield Ok(views.html.albums.show(album, musics) 

您還可以創建Future

repo.lookup(id) flatMap { album => 
    musicRepo.fromAlbum(id) map { musics => 
    Ok(views.html.albums.show(album, musics) 
    } 
} 

,您可以通過理解下面的替代在理解之前,這兩個電話可以並行發生。

val fAlbum = repo.lookup(id) 
val fMusics = musicRepo.fromAlbum(id) 

for { album <- fAlbum; musics <- fMusics } 
yield Ok(views.html.albums.show(album, musics) 
+1

第二個「for」方法是最好的解決方案,這將等待兩個期貨在將其傳遞到視圖之前解決 – Alex

+1

謝謝!所有的解決方案都可以工作我決定使用第二個「for」方法,因爲@Alex提到的優點:) –

1

你應該返回Future[Result],你正在返回Future[Future[Result]這會導致你的問題。考慮使用flatMap

def show(id: Long) = Action.async { 
    repo.lookup(id) flatMap { album => 
    musicRepo.findAlbum(id) map { musics => 
     Ok(views.html.albums.show(album, musics)) 
    } 
    } 
} 
相關問題