簡體   English   中英

循環處理期貨

[英]Deal with futures in a loop

我正在研究一種對數據庫進行查詢並占用一行的方法。 該行有一個列,用於指定父ID(如果有)。 因此,我的方法有一個名為“ iterate”的閉包,如果最后一行具有父級,則該閉包將執行相同的過程,最后該方法返回這些行的序列。 乍一看,這很簡單,但是我必須處理期貨和類似的東西,而且我對異步編程沒有太多的經驗。 所以。 我的問題是:

有沒有辦法在不使用“等待”的情況下正確執行此方法?

/**
   * 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並將其轉換為序列來修復它。

我看到的一個問題在這里: parentsSeq +: Seq(parent) 這不會改變序列,而是返回一個新序列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM