Playframework 2.0 为什么scala函数中的块变量在执行内部块后无法更新?

Playframework 2.0 为什么scala函数中的块变量在执行内部块后无法更新?,playframework-2.0,postgresql-9.4,slick-3.0,Playframework 2.0,Postgresql 9.4,Slick 3.0,我是斯卡拉的新手。我编写了一个名为calculateSubTotal的函数,其中包含产品id和数量的列表 首先,函数将从数据库中为每个产品id提取一个产品,然后计算单个小计,并与小计相加。我想返回计算的小计。计算正常,但不幸的是,它返回的是初始化值,而不是计算值。我的密码怎么了。守则如下: def calculateSubTotal(productIds: Seq[Int], quantities: Seq[Int]) = { var subTotal = 0.0 for (index

我是斯卡拉的新手。我编写了一个名为
calculateSubTotal
的函数,其中包含产品id和数量的列表

首先,函数将从数据库中为每个产品id提取一个产品,然后计算
单个小计
,并与
小计
相加。我想返回计算的小计。计算正常,但不幸的是,它返回的是
初始化值
,而不是
计算值
。我的密码怎么了。守则如下:

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
}
def calculateSubTotal(产品ID:Seq[Int],数量:Seq[Int])={
var小计=0.0

对于(index,问题在于
Products.read()
方法的结果类型是
Future[Option[Product]]]
,这意味着在当前代码中,它是在不同的线程上执行的。主线程(执行
calculateSubTotal
的线程)不会等待
Products.read()的成功执行
并立即返回结果(
在本例中为小计)。这将允许不确定的结果:有时根本不会修改
小计
,有时会部分修改,有时会得到正确的结果。最简单的解决方案是同步等待
产品。read()
结果:

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

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

异步解决方案需要重写
calculateSubTotal
,返回
Future[Int]

产品的结果类型。read()
方法?是
Future[Option[Product]
?是的…
Products.read()
返回
Future[Option[Product]
@PawełJurczenko