2016-07-14 4 views
3

Я новичок в scala. Я написал функцию с именем calculateSubTotal со списком идентификаторов и количества продуктов.Почему блочная переменная в scala-функции не могла обновиться после выполнения внутреннего блока?

Сначала функция будет извлекать продукт из базы данных для каждого идентификатора продукта, затем рассчитать 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()'? Это 'Future [Option [Product]]'? –

+0

Да ... 'Products.read()' возвращает 'Future [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) 

Асинхронный решение потребует переписывания calculateSubTotal таким образом, что возвращает Future[Int].

+0

Каким будет асинхронное решение? ..... @ Paweł Jurczenko – Johir

 Смежные вопросы

  • Нет связанных вопросов^_^