LINUX.ORG.RU

История изменений

Исправление BattleCoder, (текущая версия) :

Ну наконец-то хоть где-то моя игрушечная писанина кому-то пригодится.

Тыц https://github.com/fancywriter/car-adverts/blob/master/app/dao/CarAdvertsDao....

Тыц2 https://github.com/fancywriter/car-adverts/blob/master/app/loader/Loader.scala

везде пишешь эти db.run(query.filter(...).result), когда кажется нормальным что-то вроде query.filter(...).execute

В slick2 примерно так и было, но slick3 переписали на DBIO, чтобы каждая операция была асинхронной, поэтому запрос мало создать, надо его обернуть в db.run()...

тут вообще похоже на какой-то жаваскрипт получается. Future[Option[Future]] как сократить до Option[Future] ?

Можете обмазаться трансформерами монад, если хотите. Станет ли лучше, не уверен ;) http://typelevel.org/cats/datatypes/optiont.html

и, как я понимаю, именно здесь и понадобился нам ExecutionContext, и мы завернули в кучу Future код, который оказался блокирующим. или зачем тут ExecutionContext ?

Где вы тут увидели блокирующий код? Его нет, он весь целиком в dbio от slick. Почитайте http://docs.scala-lang.org/overviews/core/futures.html

Вообще for-comprehension - сахар на flatMap/withFilter/map/foreach. Попробуйте поэтапно переписать всё это через цепочку flatMap - в качестве упражнения, естественно. Выглядеть будет хуже и страшнее, зато вам будет понятнее, что там на самом деле происходит.

Future.map/flatMap требует ExecutionContext - в нём будут выполняться операции над результатом, который future (когда-нибудь) вернёт. Вот для этого нужен. Надеюсь, понятно объяснил...

P.S. Ещё хорошим стилем считается писать тип возвращаемого значения для public def/val. Хоть компилятор его потом и выведет, зато с типами читать легче. Да и где-то читал, что компилируется быстрее, типы выводить не надо (не замерял, не уверен).

Исходная версия BattleCoder, :

Ну наконец-то хоть где-то моя игрушечная писанина кому-то пригодится.

Тыц https://github.com/fancywriter/car-adverts/blob/master/app/dao/CarAdvertsDao....

Тыц2 https://github.com/fancywriter/car-adverts/blob/master/app/loader/Loader.scala

везде пишешь эти db.run(query.filter(...).result), когда кажется нормальным что-то вроде query.filter(...).execute

В slick2 примерно так и было, но slick3 переписали на DBIO, чтобы каждая операция была асинхронной, поэтому запрос мало создать, надо его обернуть в db.run()...

тут вообще похоже на какой-то жаваскрипт получается. Future[Option[Future]] как сократить до Option[Future] ?

Можете обмазаться трансформерами монад, если хотите. Станет ли лучше, не уверен ;) http://typelevel.org/cats/datatypes/optiont.html

и, как я понимаю, именно здесь и понадобился нам ExecutionContext, и мы завернули в кучу Future код, который оказался блокирующим. или зачем тут ExecutionContext ?

Где вы тут увидели блокирующий код? Его нет, он весь целиком в dbio от slick. Почитайте http://docs.scala-lang.org/overviews/core/futures.html

Вообще for-comprehension - сахар на flatMap/withFilter/map/foreach. Попробуйте поэтапно переписать всё это через цепочку flatMap - в качестве упражнения, естественно. Выглядеть будет хуже и страшнее, зато вам будет понятнее, что там на самом деле происходит.

Future.map/flatMap требует ExecutionContext - в нём будут выполняться операции над результатом, который future (когда-нибудь) вернёт. Вот для этого нужен. Надеюсь, понятно объяснил...