2014-05-13 2 views
1

피드 응답 재생 응답 Enumerator을 결과로 feed 메소드로 전달하고 싶습니다. 생산/소비 단계에서 다음 단계 (또는 상태 유지)로 상태를 전달해야합니다. 여기 http://engineering.klout.com/2013/01/iteratees-in-big-data-at-klout/ 나는 그것이 스레드 안전 예를 찾았지만 확실하지 않은 :Play Enumerator에 상태를 추가하는 방법은 무엇입니까?

def pagingEnumerator(url:String):Enumerator[JsValue]={ 
     var maybeNextUrl = Some(url) //Next url to fetch 
     Enumerator.fromCallback[JsValue] (retriever = { 

     val maybeResponsePromise = 
      maybeNextUrl map { nextUrl=> 
       WS.url(nextUrl).get.map { reponse => 
        val json = response.json 
        maybeNextUrl = (json \ "next_url").asOpt[String] 
        val code = response.status //Potential error handling here 
        json 
       } 
      } 

     maybeResponsePromise match { 
      case Some(responsePromise) => responsePromise map Some.apply 
      case None     => PlayPromise pure None 
     } 
    }) 
} 

Enumerator 플레이 상태를 추가하는 방법은 무엇입니까? 이 예제는 스레드로부터 안전합니까?

(/ 미래를 약속 관련된 위의 예제 된 플레이 API에 사용됩니다, 그것은 문제 자체에 영향을주지 않는까지 방치이 사실을하자) 당신은 Enumerator.unfoldM를 사용해야합니다

답변

2

:

Enumerator.unfoldM(Some(firstURL)) { maybeNextUrl => 
    maybeNextUrl map { nextUrl => 
    WS.url(nextUrl).get.map { response => 
     val json = response.json 
     val newUrl = (json \ "next_url").asOpt[String] 
     val code = response.status //Potential error handling here 
     Some((newUrl, json)) 
    } 
    } getOrElse (Future.successful(None)) 
} 
+0

내가 알기 전까지는 API에 맞서 머리를 부숴 야했습니다. – Ryan

관련 문제