Как преобразовать последовательность задач <MyType>в последовательность MyType - PullRequest
1 голос
/ 29 марта 2019

Итак, у меня есть последовательность типа 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>>, который я не смогу использовать.

1 Ответ

2 голосов
/ 29 марта 2019

Метод .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
...