2016-07-14 19 views
3

我是scala的新手。我寫了一個名爲calculateSubTotal的函數,其中包含產品ID和數量列表。爲什麼在執行內部塊之後,scala函數中的塊變量無法更新?

起初該功能會從數據庫中爲每個產品ID挑選一個產品,然後計算individual sub total並總結爲sub total。我想返回計算的小計。計算是可以的,但不幸的是它返回initialized value而不是calculated 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

相關問題