【发布时间】:2014-12-09 17:49:26
【问题描述】:
我有一个 Future[Future[Set[String]]。我对其进行平面映射以返回 Future[Set[String]]。我等待无穷大(我知道这很糟糕),然后检查 Future 是否完整。它返回真。但是,当我获得 Future 返回的值并尝试将其添加到 Set 时,它不会添加它。回调结束时的语句首先打印。当我从该方法返回 Set 时,尽管 Future 确实返回值,但它始终为空。我添加了 cmets 来解释事件发生的顺序。如果我做错了什么,请指出我!谢谢!
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
【问题讨论】:
-
标题中提到的
onComplete回调在哪里? -
@m-z 我编辑了这篇文章。我使用 onComplete 还是 foreach 都没关系。它仍然没有先执行 Success 块。
-
googleXfpSegments这是一个可变的Set吗? -
@SoumyaSimanta 不,这是一个不可变的集合。
-
@Anand - 我不清楚如何重新分配给“val googleXfpSegments”?