如何将 Task<MyType> 序列转换为 MyType 序列
How to convert a sequence of Task<MyType> to a sequence of MyType
所以我现在有一个 seq<System.Threading.Tasks.Task<Restaurant>>
类型的序列,我想把它变成 seq<Restaurant>
.
类型的序列
我目前正在使用 TaskBuilder.fs 库,根据我的研究,我需要使用 let!或者做!对于这种情况,但他们需要 task {}
,当与 Seq.map 一起使用时,会带回相同的任务类型。
let joinWithReviews (r : Restaurant) =
task {
let! reviewResult = Reviews.Database.getByLocationId cnf.connectionString r.Restaurant_Id
match reviewResult with
| Ok reviewResult ->
let restaurant = { r with Reviews = (List.ofSeq reviewResult)}
return restaurant
| Error ex ->
return raise ex
}
let indexAction (ctx : HttpContext) =
task {
let (cnf:Config) = Controller.getConfig ctx
let! result = Restaurants.Database.getAll cnf.connectionString
match result with
| Ok result ->
let restaurantWithReviews = (Seq.map joinWithReviews result)
return index ctx (List.ofSeq restaurantWithReviews)
| Error ex ->
return raise ex
}
所以我的结果是 Seq<Restaurant>
类型,我需要为每家餐厅添加评论,所以我使用 Seq.map 获取 restaurantWithReviews 类型 seq<System.Threading.Tasks.Task<Restaurant>>
我不会能用。
.NET 方法 System.Threading.Tasks.Task.WhenAll
会将 seq<Task<'a>>
转换为 Task<'a[]>
。如果您在 task { }
块内,则可以使用 let!
获得结果。
let restaurants: seq<Restaurant>
let! withReviews: Restaurant[] =
restaurants
|> Seq.map joinWithReviews
|> Task.WhenAll
所以我现在有一个 seq<System.Threading.Tasks.Task<Restaurant>>
类型的序列,我想把它变成 seq<Restaurant>
.
我目前正在使用 TaskBuilder.fs 库,根据我的研究,我需要使用 let!或者做!对于这种情况,但他们需要 task {}
,当与 Seq.map 一起使用时,会带回相同的任务类型。
let joinWithReviews (r : Restaurant) =
task {
let! reviewResult = Reviews.Database.getByLocationId cnf.connectionString r.Restaurant_Id
match reviewResult with
| Ok reviewResult ->
let restaurant = { r with Reviews = (List.ofSeq reviewResult)}
return restaurant
| Error ex ->
return raise ex
}
let indexAction (ctx : HttpContext) =
task {
let (cnf:Config) = Controller.getConfig ctx
let! result = Restaurants.Database.getAll cnf.connectionString
match result with
| Ok result ->
let restaurantWithReviews = (Seq.map joinWithReviews result)
return index ctx (List.ofSeq restaurantWithReviews)
| Error ex ->
return raise ex
}
所以我的结果是 Seq<Restaurant>
类型,我需要为每家餐厅添加评论,所以我使用 Seq.map 获取 restaurantWithReviews 类型 seq<System.Threading.Tasks.Task<Restaurant>>
我不会能用。
.NET 方法 System.Threading.Tasks.Task.WhenAll
会将 seq<Task<'a>>
转换为 Task<'a[]>
。如果您在 task { }
块内,则可以使用 let!
获得结果。
let restaurants: seq<Restaurant>
let! withReviews: Restaurant[] =
restaurants
|> Seq.map joinWithReviews
|> Task.WhenAll