2014-11-30 3 views
-9

Я, глядя на лучший способ организовать это ниже кодДля понимания вызова метода будущего и возвращения типа Future

это версия 1.0, и что это лучший способ, чтобы вернуть будущее

class ComparePrepMgr(factory:IFactoryBuilder) { 

    val daoact = factory.actorFactory.getActor[DAOSupervisor] //Returns Option[IActorURI] 
    def prepare(testplan:TestPlan) : Future[UnitofWorkRequest] = 
    { 
    for ( dao <- daoact; 
      testcase <- testplan.testcases; //Returns testcase instance from list type 
      sourceenvfut = getFuture[Vector[EnvironmentInfo]](dao, queryDAO[EnvironmentInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.sourceenv,false),None))) ; 
      destenvfut = getFuture[Vector[EnvironmentInfo]](dao, queryDAO[EnvironmentInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.destenv ,false),None))) ; 
      sourceobjfut = getFuture[Vector[ObjectInfo]](dao, queryDAO[ObjectInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.source,false),None))) ; 
      destobjfut = getFuture[Vector[ObjectInfo]](dao, queryDAO[ObjectInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.destination ,false),None))); 
      sourceenv <- sourceenvfut;destenv <- destenvfut; sourceobj <- sourceobjfut; destobj <- destobjfut 
     ) 
     { 
      UnitofWorkRequest(testplan.copy(testcases = List()) , testcase, sourceenv.last, destenv.last, sourceobj.last,destobj.last) 
     } 

это другой вариант кода, который работает, но заставляет меня разбить мою функцию b/c. Я организую для понимания на основе подобного типа возврата и, следовательно, я заинтересован в коде выше

class ComparePrepMgr(factory:IFactoryBuilder) { 

    val daoact = factory.actorFactory.getActor[DAOSupervisor] 
    def prepare(testplan:TestPlan) = 
    { 
    for ( testcase <- testplan.testcases; 
      dao <- daoact 
     ) yield prepareFuture(testplan,dao,testcase) 
    } 

    def prepareFuture(testplan:TestPlan,dao:IActorURI,testcase:TestCaseInfo) = 
    { 
    for ( sourceenv<- getFuture[Vector[EnvironmentInfo]](dao, queryDAO[EnvironmentInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.sourceenv,false),None))); 
      destenv <- getFuture[Vector[EnvironmentInfo]](dao, queryDAO[EnvironmentInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.destenv ,false),None))); 
      sourceobj <- getFuture[Vector[ObjectInfo]](dao, queryDAO[ObjectInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.source,false),None))) ; 
      destobj <- getFuture[Vector[ObjectInfo]](dao, queryDAO[ObjectInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.destination ,false),None))) 
     ) yield UnitofWorkRequest(testplan.copy(testcases = List()) , testcase, sourceenv.last, destenv.last, sourceobj.last,destobj.last) 
    } 
} 

Любой помощь в создании версии 1.0 работы ценятся.

+8

oh my gosh ..... – dk14

ответ

0

Примите мои извинения, если мой вопрос не был правильно оформлен, я вижу, что многое из того, что я пытался достичь, - это инкапсулировать код внутри одной функции с будущим возвращаемым значением, а также пытаться обернуть голову вокруг будущей структуры , так выглядит, наконец, я смог добиться того, что искал с помощью обещания. Вот окончательный код, если кто-нибудь случается быть на одной лодке в будущем

def prepare(testplan:TestPlan) : Future[UnitofWorkRequest] = 
    { 
      val unitworkprom = promise[UnitofWorkRequest] 
    for ( testcase <- testplan.testcases; 
      dao <- daoact 
     ) 
    { 
     val f1 = getFuture[Vector[EnvironmentInfo]](dao, queryDAO[EnvironmentInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.sourceenv,false),None))); 
     val f2 = getFuture[Vector[EnvironmentInfo]](dao, queryDAO[EnvironmentInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.destenv ,false),None))); 
     val f3 = getFuture[Vector[ObjectInfo]](dao, queryDAO[ObjectInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.source,false),None))) ; 
     val f4 = getFuture[Vector[ObjectInfo]](dao, queryDAO[ObjectInfo](new DataQueryExp(ObjectIdEqOp("_id",testcase.destination ,false),None))) 
     for (sourceenv <- f1; destenv <- f2; sourceobj <- f3 ; destobj <- f4) 
     { 
      unitworkprom.success(UnitofWorkRequest(testplan.copy(testcases = List()) , testcase, sourceenv.last, destenv.last, sourceobj.last,destobj.last)) 
     } 
    } 
    unitworkprom.future 
    } 

Так с помощью обещаний, то функция немедленно возвращает пустое будущее, но код внутри для понимания, есть 4 фьючерсов, которые являются вызываемый параллельно, получит результат, а затем использует функцию успеха обещания, чтобы установить значение, которое, наконец, вызовет обратный вызов.