0

我有一个控制器,有很多业务逻辑,我想移动Action.async代码块。此代码的工作,我怎么能移动到另一个类(服务)是播放框架2.5移动Action.async逻辑从控制器到服务

def tweetsnew(query: String) = Action.async { 
// Move From Here... 
credentials.map { 
    case (consumerKey, requestToken) => 
    ws.url("https://api.twitter.com/1.1/search/tweets.json") 
     .sign(OAuthCalculator(consumerKey, requestToken)) 
     .withQueryString("q" -> query) 
     .withQueryString("max_id" -> "833342796736167936") 
     .get().map { twitterResponse => 
     if (twitterResponse.status == 200) { 
     // Here There Are More Complex Logic 
     Ok("That is fine: "+twitterResponse.body) 
     } else { 
     throw new Exception(s"Could not retrieve tweets for $query query term") 
     } 
    } 
}.getOrElse { 
    Future.failed(new Exception("You did not correctly configure the Twitter credentials")) 
} 
//....To Here. To Another Class 
} 

我已经检查了docummentation的Action.async?:里面的代码,一些涉及到create a Future[Result]但我不能使该函数返回Action.async期望的相同类型。

+0

谢谢@vdebegue这是一个很好的解决方案。我想提出另一种解决方案。 –

回答

1

Action.async预计Future[Result]返回类型,所以你需要创建一个返回Future[Result]

第一步的功能,提取您的代码的函数:

object TwitterService { 
    def search(query: String, consumerKey: ConsumerKey, requestToken: RequestToken)(implicit ws: WSClient, ec: ExecutionContext): Future[Result] = { 
    // your code that make the ws call that returns Ok("...") 
    } 
} 

然后在控制器中调用函数:

def tweetsnew(query: String) = Action.async { 
    credentials.map { 
    case (consumerKey, requestToken) => TwitterService.search(query, consumerKey, requestToken) 
    }.getOrElse { 
    // Better to send a bad request or a redirect instead of an Exception 
    Future.successful(BadRequest("Credentials not set")) 
    } 
} 
+0

谢谢@vdebegue。我想提出另一种解决方案。 为了在这样的服务创建的性状: '@ImplementedBy(classOf [通过twitterfeed]) 性状QueryTweets { DEF queryByWord(查询:字符串):未来[选项[JsValue]] }' 2)执行该性状在服务,相同的文件: '类通过twitterfeed @Inject()延伸QueryTweets { //一个复杂的代码 Json.parse( “” “{” changeByObject “:” 是 “}”, “”) 一些(aJsonResponse) 3)In Controller: 'def tweetsnew(query:String)= Action.async {query} (Ok(响应)) } } }' –

+1

这也适用,它取决于你希望在WSClient和ExecutionContext中注入依赖关系。你的方式更“java-ish” – vdebergue