2015-09-21 4 views
1

У меня есть метод, который должен переходить через Будущее и возвращать Кортеж. Вот оно:Scala Будущее для понимания

private def myMethod(id: Long): Future[(Double, Double)] = { 
    val result = for { 
     someValue <- run { getFromDb(id).headOption } 
     value  <- someValue 
    } yield { 
     value.valueType match { 
     case ValueType.TypeA => (1.0, 1.0) 
     case ValueType.TypeB => (2.0, 2.0) 
     } 
    } 
    } 

Вот мой метод запуска:

private def run[R](dbio: slick.dbio.DBIOAction[R, slick.dbio.NoStream, scala.Nothing]) = async { 
    await(db.run(dbio)) 
    } 

Он использует библиотеку Scala Async ко времени мои звонки в базу данных!

метод getFromDB просто делает запрос:

def getFromDb(myId: Long) { 
    MyTableQuery.filter(_.id === myId) 
} 

It жалобы, MyMethod возвращает будущее [Nothing]. Здесь я не вижу никаких проблем. Какие-нибудь подсказки относительно того, что может не удовлетворять возвращаемому типу, который я ищу?

+0

Не 'асинхронной {Await (db.run (dbio))}' же, как только 'db.run (dbio)'? –

+0

Да, но это не проблема! Когда у меня есть несколько вызовов в базе данных, я могу запустить его последовательно, используя метод run! – sparkr

+0

Понял. Каков тип возврата 'run'? Потому что ваши данные снова отображаются над возвращаемым значением, указывая на то, что у вас есть что-то вроде «Future [Future [T]]» в качестве возвращаемого значения, что кажется странным. –

ответ

4

Вот упрощенная версия, которая имеет ту же ошибку:

def method: Future[(Double, Double)] = { 
    val result = for { 
    someValue <- Future("a") 
    value  <- Future("b") 
    } yield { 
    value match { 
     case "a" => (1.0, 1.0) 
     case "b" => (2.0, 2.0) 
    } 
    } 
} 

Проблема заключается в том, что вы захватываете тип возвращаемого значения в result, поэтому метод не имеет типа возвращаемого значения. Действительная форма этой упрощенной функции будет одно из следующих действий:

def method: Future[(Double, Double)] = { 
    val result = for { 
    someValue <- Future("a") 
    value  <- Future("b") 
    } yield { 
    value match { 
     case "a" => (1.0, 1.0) 
     case "b" => (2.0, 2.0) 
    } 
    } 
    result 
} 

Или:

def method: Future[(Double, Double)] = { 
    for { 
    someValue <- Future("a") 
    value  <- Future("b") 
    } yield { 
    value match { 
     case "a" => (1.0, 1.0) 
     case "b" => (2.0, 2.0) 
    } 
    } 
} 
+0

Я не могу быть таким глупым. По какой-то странной причине мой IntelliJ жаловался, что видит будущее [Nothing], и внезапно он исчез и, кажется, возвращает правильный тип кортежа! – sparkr

+0

Еще одна странная вещь, которую я заметил, заключается в том, что если я удалю возвращаемый тип из своего метода, мой IntelliJ жалуется, что видит в нем будущее [Nothing]! Поэтому я должен сохранить неизменный тип возврата, чтобы он работал! – sparkr

+1

«мой IntelliJ жаловался». Обнаружение ошибок IDEA в Scala просто не является надежным. Вам нужно проверить, действительно ли он компилируется. –

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