2017-09-01 16 views
2

所以我有一個Async<string> []和我的生活我無法弄清楚如何拆箱它!如何拆箱異步<string> []

我開始與

Job<Result<string>> []

然後我設法得到它

Job<string> []

所以我在Job.toAsync加以爲它轉換成一個異步可能是更容易脫身。 NOPE

現在我有

Async<string> []

我使用Hopac LIB

所以我的問題是,如何我剛剛得到一個string []

回答

4

你需要以某種方式運行這些異步操作,讓每一個你的回報價值。最簡單的方法是並行運行它們,因爲在那裏,它內置的功能 - Async.Parallel。這個函數異步操作的序列,並返回一個數組,然後你就可以用Async.RunSynchronously或類似運行的異步:或者

let asyncs : Async<string> [] = ... 
let results = asyncs |> Async.Parallel |> Async.RunSynchronously 

,如果你想讓他們按順序運行,您可以通過一個運行它們之一,隨時隨地積累結果。不幸的是,沒有內置函數來做到這一點,所以你必須自己編寫它。事情是這樣的:

let runEm asyncs = 
    let loop rest resultsSoFar = 
     match rest with 
     | x::xs -> 
      async { 
      let! r = x 
      return! loop xs (r:resultsSoFar) 
      } 
     | [] -> 
      async { return resultsSoFar } 

    async { 
    let! ress = loop asyncs [] 
    return ress |> List.reverse 
    } 

// Usage: 
let asyncs : Async<string> [] = ... 
let results = runEm asyncs |> Async.RunSynchronously