가능하면 ask
을 사용하지 않으려면 피해야합니다.
약속을 구매자와 판매자 배우에게 보내고, 해당 선물을 구성하고 약속이 이행되면 거래를 처리하는 방법은 다음과 같습니다. 당신은 구매자로부터 자금을 얻을 수 있기 때문에, 당신은 판매자로부터 주식을 얻을 수 있기 때문에, 또는 뭔가 transact
에 잘못된 때문에 : 궁극적 인 결과는 여러 가지 이유로 실패 할 수 있다는
는
import scala.concurrent.{future, promise}
import scala.concurrent.ExecutionContext.Implicits.global
val fundsPromise = promise[Funds]
val sharesPromise = promise[Shares]
buyerActor ! GetFunds(amount, fundsPromise)
sellerActor ! GetShares(numShares, stock, sharesPromise)
val futureFunds = fundsPromise.future
val futureShares = sharesPromise.future
val purchase =
for { funds <- futureFunds; shares <- futureShares }
yield transact(funds, shares)
purchase onComplete {
case Success(transactionResult) =>
buyerActor ! PutShares(numShares)
sellerActor ! PutFunds(amount)
// tell somebody it worked
case Failure(t) =>
futureFunds onSuccess { case _ => buyerActor ! PutFunds(amount) }
futureShares onSuccess { case _ => sellerActor ! PutShares(numShares) }
// tell somebody it failed because of t
}
참고. 그래서 실패 할 때 우리는 자금을 확인하고 미래를 나눠 가지고 있는지 확인하고 만약 그렇다면 우리가 취한 것을 돌려줍니다.
또한 선물로는 amount
및 numShares
을 마감합니다. 즉, val이어야합니다. 만약 그들이 vars 였다면, future가 실제로 실행될 때 잘못된 값을 사용하게 될 수도 있습니다.
bsmk가 지적했듯이 여기서는 과 sellerActor
이 위의 코드와 동일한 JVM에 있다고 가정합니다. 만약 그렇지 않다면, 당신은 지역 배우가 원격 배우의 말을 듣고 약속을 처리하게 할 수 있습니다; 더 좋은 방법이 있다면 의견에 알려주십시오.
구매자와 판매자 모두에게 두 개의 'ask'메시지를 보내고 'for-comprehension'을 사용하여 원하는 약속을 반환하는 방법은 무엇입니까? – Peter
구매자와 판매자가 모두 응답 할 때까지 시장이 기다릴 필요가 없습니까? 시장에서 단순히 약속을 생성하고 구매자와 판매자 중 하나 (또는 둘 모두)가 기다리는 것을 선호합니다 (필요한 경우). – davidrpugh
질문에 답변 한 경우 답변을 수락하십시오.:) – mdm