3

所以我目前有一个 type 序列,seq<System.Threading.Tasks.Task<Restaurant>>我想把它变成一个 type 序列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>>我无法使用的类型。

4

1 回答 1

2

.NET 方法System.Threading.Tasks.Task.WhenAll将转换seq<Task<'a>>Task<'a[]>. let!如果你在一个task { }块内,你可以得到结果。

let restaurants: seq<Restaurant>

let! withReviews: Restaurant[] =
    restaurants
    |> Seq.map joinWithReviews
    |> Task.WhenAll
于 2019-03-29T19:14:46.637 回答