F#中如何在Seq.map内正确获取Async异步返回值
F# 配合Microsoft.Playwright批量获取元素属性的异步写法修复
错误原因
- 第一行代码执行后得到的
lines是System.Collections.Generic.IReadOnlyList类型,本身实现了IEnumerable接口,可以直接用Seq.map遍历 - 经
Seq.map转换后得到的是seq<Async<string>>类型,也就是多个独立的异步任务集合,let!仅支持等待单个异步操作,无法直接处理异步任务集合,因此原代码无法正常运行。
修复代码
把第二行的异步任务集合通过Async.Parallel合并为单个异步操作即可,并行执行所有属性获取任务,效率更高:
let! lines = Async.AwaitTask(page.QuerySelectorAllAsync("#statementLines>div")) // 新增Async.Parallel合并多个异步任务,等待所有任务完成后返回结果数组 let! values = lines |> Seq.map(fun line -> Async.AwaitTask(line.GetAttributeAsync("data-statementlineid"))) |> Async.Parallel
如果你需要按顺序逐个执行异步任务而非并行,把Async.Parallel替换为Async.Sequential即可。
可选后续处理
如果需要将返回的数组转换为列表等其他集合类型,可以在后面追加对应转换方法:
// 转为List<string> let valueList = values |> Array.toList
内容的提问来源于stack exchange,提问作者Martin Thompson
相关产品推荐
相关产品推荐

