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