Сделка с фьючерсами в петле

Я работаю над методом, который делает запрос к базе данных и занимает одну строку. В этой строке есть столбец, в котором указан родительский идентификатор, если таковой имеется. Итак, у моего метода есть замыкание с именем "iterate", которое выполняет тот же процесс, если последняя строка имеет родителя и, наконец, метод возвращает последовательность этих строк. На первый взгляд, это просто, но мне приходится иметь дело с фьючерсами и тому подобным, и у меня нет большого опыта в асинхронном программировании. Так. Мой вопрос:

Есть ли способ сделать этот метод правильно без использования "Await"?

/**
   * Returns all the parents of the given sector if any
   * @param childSector
   * @return
   */
  def getParents(childSector: ShopSector): Future[Option[Seq[ShopSector]]] = {
    val p = Promise[Option[Seq[ShopSector]]]
    val f: Future[Option[Seq[ShopSector]]] = p.future

    val parentsSeq: Seq[ShopSector] = Seq()

    f.onComplete( thing => println(s"Result from Iteration future: $thing") )

    def iterate(sector: ShopSector): Unit = {
      val query = for {
        c <- ShopSectors if c.id === sector.id
        p <- c.parent
      } yield p

      exists(sector.parent_id).map { exists =>
        if (exists) {
          db.run(query.result.head).map { parent =>
            println(s"Result parent: $parent")
            parentsSeq +: Seq(parent)
            iterate(parent)
          }
        } else {
          p success Option(parentsSeq)
        }
      }
    }

    iterate(childSector)

    f
  }

Кстати, я использую Slick. И обратите внимание, что этот метод не работает хорошо. Он возвращает пустой Seq, и я знаю, что это будет возвращение. Но печать работает отлично, и печать правильных результатов. Дело в том, что я не могу представить себе способ иметь переменную, которая не "исчезнет" до того, как все фьючерсы будут завершены.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Хорошо, ребята. Проблема была так проста. Как сказал Ixx, коллекция parentSeq не является изменчивой. Я исправил это, используя ListBuffer, а затем преобразовав его в последовательность.

1 ответ

Решение

Здесь я вижу одну проблему: parentsSeq +: Seq(parent), Это не изменяет последовательность, а возвращает новую последовательность.

Другие вопросы по тегам