f# - 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
}
解决方案
我会看看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
}
推荐阅读
- angular - NGXS Selector observable 未获得新状态
- objective-c - 动态创建包含按钮的视图——约束呢?
- c++ - 是否有一些输入条件可以让“cin >> someStringValue”评估为“假”?
- python - 如何在 Keras/tf2.0 自定义损失函数中收集与真实标签不对应的 y_pred 元素?
- hdl - 我已经使用原语为 JK 触发器编写了 verilog 代码
- c# - 在winform上获取按钮的父级
- python - 我该怎么做才能保持绿色和透明度?
- web-worker - 使用 std::thread 时无法在“WorkerGlobalScope”上执行“importScripts”
- python - 我已经为模拟BeamRun 编写了代码,当我运行它时它说我有语法错误
- typescript - 检查事件发射器接收到的类型