def processSync(databaseServer: DatabaseServer, databaseIdentity: DatabaseIdentity): Future[String] = {
val info = for {
catalogs <- databaseSyncService.getCatalogs(databaseServer.address, databaseServer.port, databaseIdentity.login, databaseIdentity.password)
clubbers <- getClubbers(databaseServer.id)
ignoredCatalogs <- ignoredCatalogService.get(databaseServer.id)
} yield (catalogs, clubbers, ignoredCatalogs)
val result = info.map{
case(catalogs, clubbers, ignoredCatalogs) => {
val currentCatalogs = (clubbers.map(clubber =>
Seq(Some(clubber.mainSchema), clubber.archiveSchema, clubber.blacklistSchema, clubber.logsSchema).flatten
).flatten ++ ignoredCatalogs).toSet
val serverCatalogs = catalogs.toSet
if(currentCatalogs == serverCatalogs) {
"synchronized"
} else {
"outOfSync"
}
}
}.recover{
case sqlE: SQLServerException =>{
logger.error(s"Conection error with ${databaseServer.name}", sqlE)
"connectionError"
}
}
for{
realResult <- result
_ <- databaseServerRepo.updateSync(databaseServer.id, realResult)
} yield realResult
}
가에 대한 각 값은 미래이지만, 우리가 필요한 것을 표시하기 위해 당신은 수율을 사용하기위한의 끝에서, 자신의 가치에 액세스 할 수 있습니다 노호 : 예를 들어, 다음은 좀 더 복잡한 예입니다 반환됩니다.
별례이 제어기 호출 될 수합니다 (shilouete 부분을 무시하거나, 인증 라이브러리 단순히 미래 [결과]로 복귀 형 생각할)
def sync(id: Int) = silhouette.SecuredAction.async { implicit request: SecuredRequest[DefaultEnv, AnyContent] =>
val actions = for {
(server, identity) <- databaseServerService.getWithIdentity(id)
databaseCatalogs <- databaseSyncService.getCatalogs(server.address, server.port, identity.login, identity.password)
ignoredCatalogs <- ignoredCatalogService.get(id)
clubberIntegrations <- clubberIntegrationService.getClubbersListOrAutoFill(id, databaseCatalogs, ignoredCatalogs.map(_.name))
} yield Future.successful {
val catalogs = databaseCatalogs.map { x =>
val ignoredCatalogNotes = ignoredCatalogs.filter(_.name == x).map(_.note).headOption
DatabaseCatalog(x, ignoredCatalogNotes.getOrElse(""), ignoredCatalogNotes.isDefined)
}
Ok(web.databaseserver.views.html.databaseServerSync(request.identity, server, DatabaseServerForSync(clubberIntegrations, catalogs)))
}
actions.recover {
case _: SQLServerException => {
databaseServerService.getName(id).map(x => {
Redirect(web.databaseserver.controllers.routes.DatabaseServerController.list())
.flashing("error" -> Messages("databaseSync.couldNotConnect", x))
})
}
}.flatMap(x => x)
}
또한, 내가 깜빡하고 Future를 사용하는 함수를 처리해야하고 다른 함수를 사용하지 않는 함수를 처리해야하는 경우 후자를 Future.successful
으로 변환 할 수 있고 Seq[Future[Any]]
을 Future[Seq[Any]]
으로 변환하고 다른 방법으로 미래를 처리하는 데 도움이되는 다른 함수가 있습니다.