首页 > 解决方案 > F# 惯用的 async while 循环累加转换

问题描述

处理异步 while 循环累积的惯用 F# 方式是什么?

我正在使用新的(仍处于预览阶段)Azure Cosmos DB SDK。查询数据库返回CosmosResultSetIterator<T>具有HasMoreResults属性和FetchNextSetAsync()方法的 a。我对 C# 代码的直接翻译如下所示:

let private fetchItemsFromResultSet (resultSetIterator: CosmosResultSetIterator<'a>) =
    let results = ResizeArray<'a>()
    async {
        while resultSetIterator.HasMoreResults do
            let! response = resultSetIterator.FetchNextSetAsync() |> Async.AwaitTask
            results.AddRange(response |> Seq.toArray)

        return Seq.toList results
    }

标签: f#azure-cosmosdbidioms

解决方案


我会看看AsyncSeq包。您可以使用它来创建异步计算的序列,然后异步或并行迭代它们。这允许 async-binding 在序列内,并且 yield 异步发生,因此您不必显式构建累加器。

您可以使用它来执行以下操作:

open FSharp.Control

let private fetchItemsFromResultSet (resultSetIterator: CosmosResultSetIterator<'a>) =
    asyncSeq {
        while resultSetIterator.HasMoreResults do
            let! response = resultSetIterator.FetchNextSetAsync() |> Async.AwaitTask
            yield! response |> AsyncSeq.ofSeq
    }

推荐阅读