我試圖找出順序執行一系列期貨的最好方法,其中一個未來的執行取決於前一個。我試圖爲任意數量的期貨做這件事。斯卡拉 - 依次執行任意數量的期貨但依賴於
用戶案例:
- 我從數據庫中檢索了一些IDS的。
- 我現在需要檢索Web服務上的一些相關數據。
- 我想要停止,一旦我找到了有效的結果。
- 我只關心成功的結果。
並行執行這些操作,然後解析返回的結果集合不是一個選項。我必須一次執行一個請求,並且只有在前一個請求沒有返回結果時才執行下一個請求。
目前的解決方案是沿着這些路線。使用foldLeft執行請求,然後僅在前一個未來滿足某些條件時評估未來的未來。
def dblFuture(i: Int) = { i * 2 }
val list = List(1,2,3,4,5)
val future = list.foldLeft(Future(0)) {
(previousFuture, next) => {
for {
previousResult <- previousFuture
nextFuture <- { if (previousResult <= 4) dblFuture(next) else previousFuture }
} yield (nextFuture)
}
}
這樣做的很大的弊端是:a)我一直在處理所有的項目甚至有一次我有一個結果,我很高興和b)一旦我找到了結果我之後,我一直在評估謂詞。在這種情況下,這很簡單,但實際上它可能更復雜。
我覺得我錯過了一個更優雅的解決方案。
我對用例困惑,因爲它似乎沒有就像它具有您所描述的那種數據流依賴性(「Future的執行取決於前一個」),因爲如果前一個Future的結果是* empty *,那麼您只執行下一個Future。我錯過了什麼?也就是說,未來的未來除了僅僅決定它是否執行之外,還會以任何方式依賴於以前的結果? – 2014-10-29 03:08:39
這與http:// stackoverflow非常相似。com/questions/26438991/is-there-sequential-future-find/26439838#26439838(請參閱我的答案)和http://stackoverflow.com/questions/26349318/how-to-invoke-a-method-again-並且直到它返回一個未來值包含 – 2014-10-29 06:04:06
@ChrisMartin下一個期貨執行不僅取決於前一個Future是否成功,還取決於響應。例如:如果以前的未來包含狀態爲404的WSResponse,則執行下一個未來,否則不執行。 – healsjnr 2014-10-29 23:29:46