2016-07-14 6 views
3

나는 scala를 처음 사용합니다. 제품 ID 및 수량 목록이있는 calculateSubTotal이라는 함수를 작성했습니다.스칼라 함수의 블록 변수가 내부 블록을 실행 한 후 업데이트 할 수없는 이유는 무엇입니까?

처음에이 함수는 각 제품 ID에 대해 데이터베이스에서 제품을 가져온 다음 individual sub total을 계산하고 sub total으로 요약합니다. 계산 된 소계를 반환하고 싶습니다. 계산은 정상이지만 불행히도 calculated value이 아닌 initialized value을 반환합니다. 내 코드는 뭐니? 코드는 다음과 같습니다 : -

def calculateSubTotal(productIds: Seq[Int], quantities: Seq[Int]) = { 
    var subTotal = 0.0 
    for (index <- 0 to productIds.length - 1) { 
    val productId = productIds(index) 
    val quantity = quantities(index) 
    val futureProduct = Products.read(productId) 
    for { 
     product <- futureProduct 
    } yield { 
     val listPrice = product.get.listPrice 
     subTotal += listPrice * quantity 
    } 
    } 
    subTotal 
} 

위의 함수가 항상 초기화 된 것처럼 0.0을 찾습니다. 올바른 코드는 무엇입니까?

+1

'Products.read()'메소드의 결과 유형은 무엇입니까? 그것은'미래 [옵션 [제품]]인가? –

+0

예 ...'Products.read()'는 다음을 반환합니다 [Option [Product]] @ PawełJurczenko – Johir

답변

1

Products.read() 메서드의 결과 형식이 Future[Option[Product]]인데, 이는 현재 코드에서 다른 스레드에서 실행된다는 것을 의미합니다. 주 스레드 (calculateSubTotal을 실행하는 주 스레드)는 Products.read()의 성공적인 실행을 기다리지 않고 바로 결과 (subTotal)를 반환합니다. 이렇게하면 비 결정적인 결과가 허용됩니다. 때때로 subTotal은 전혀 수정되지 않으며, 때로는 부분적으로 수정되며 때로는 적절한 결과를 얻습니다. 가장 간단한 해결책은 동 기적으로 Products.read() 결과를 기다려야하는 것입니다 :

import scala.concurrent.duration.Duration 
import scala.concurrent.Await 

Await.result(Products.read(productId), Duration.Inf) 

비동기 솔루션은 Future[Int]를 반환하는 방법에 calculateSubTotal를 재 작성 필요합니다.

+0

비동기식 솔루션은 무엇입니까? ..... @ Paweł Jurczenko – Johir