2014-12-09 7 views
2

나는 미래 [미래 [세트 [String]]을 가지고있다. 나는 미래를 돌려주기 위해 그것을 Flatmap [Set [String]]. 나는 무한대를 기다리고 (나는 이것이 나쁘다는 것을 알고있다), 그리고 미래가 완료되었는지를 확인한다. 그것은 사실을 반환합니다. 그러나 Future에서 반환 된 값을 가져 와서 Set에 추가하려고하면 추가되지 않습니다. 콜백이 끝나면 명령문이 먼저 인쇄됩니다. 메서드에서 Set을 반환하면 Future가 값을 반환하지만 항상 비어 있습니다. 사건의 순서를 설명하는 주석을 추가했습니다. 내가 잘못한 일이 있으면 가르쳐주세요! 감사!스칼라 미래 onComplete 콜백이 즉시 실행되지 않음

val googleXfpSegments = Set[String]() 
val customCriteriaFuture: Future[List[Long]] = getCustomCriteriaValueIds(lineItemPage.getResults()) 
// getCustomCriteriaValues returns a Future[Set[String]] 
val criteriaValueList = customCriteriaFuture.flatMap(criteriaIdList => getCustomCriteriaValues(criteriaIdList.toSet)) 
// I wait for infinite time 
Await.result(criteriaValueList, scala.concurrent.duration.Duration.Inf) 
log.info("Future Completed = " + criteriaValueList.isCompleted) // This returns true 
criteriaValueList onComplete { 
    case Success(segmentNames) => { 
     // This statement gets printed after the "TEST" value gets printed 
     log.info("SegmentNameList = " + segmentNames.mkString(",")) 
     googleXfpSegments ++= segmentNames 
     // This prints nothing which means the segmentNames is not getting added 
     log.info("Google Segments = " + googleXfpSegments.mkString(",")) 
    } 
    case Failure(error) => log.error("Error occurred ", error) 
} 
googleXfpSegments += "TEST" 
// This prints TEST 
log.info("Google Segments = " + googleXfpSegments.mkString(",")) 

로그 출력은 다음과 같습니다

[info] [INFO] [2014-12-09 17:25:01,147] [service.GoogleXFPService] Future Completed = true 
[info] [INFO] [2014-12-09 17:25:01,148] [service.GoogleXFPService] Google Segments = TEST 
[info] [INFO] [2014-12-09 17:25:01,148] [service.GoogleXFPService] SegmentNameList = vt.cm,vt.cp,ex.qy,ex.ahe,cm.gannett_trav 
+0

제목에 언급 된 'onComplete' 콜백은 어디에 있습니까? –

+0

@ m-z 게시물을 편집했습니다. onComplete 또는 foreach를 사용하면 문제가되지 않습니다. 성공 블록을 먼저 실행하지 않습니다. – Anand

+0

'googleXfpSegments'는이 값이 가변적 인'Set'입니까? –

답변

4

당신은 값으로 Await.result(criteriaValueList, scala.concurrent.duration.Duration.Inf)의 출력을 할당해야합니다. 현재 완료 될 때까지 기다리는 중입니다. 출력을 사용하지 않고 onComplete 콜백을 이미 완료 한 미래에 붙이면 콜백이 실행되기 전에 프로그램이 종료됩니다.

val segmentNames = Await.result(criteriaValueList, scala.concurrent.duration.Duration.Inf) 
log.info("Google Segments = " + segmentNames.mkString(",")) 
+0

저를 계몽 해 주셔서 대단히 감사합니다! 그것은 확실히 일했다! – Anand

관련 문제