F#中能否管道传递任务结果?能否合并代码且不使用.Result?
F#中任务结果的管道传递与代码合并
当然可以对任务的结果进行管道传递,而且完全能将你提供的两段代码合并为一条语句,同时避免使用会阻塞线程的.Result属性。
修改后的代码
let! sValue = page.EvaluateAsync("() => this.window._StatementLinesData") |> Async.AwaitTask |> Async.map (fun statementData -> JObject.Parse(statementData.Value.GetRawText()).Last.Last |> (fun item -> item.Children()) |> Seq.map(fun item -> item.ToObject<StatementLine>()) )
代码说明
- 先用
Async.AwaitTask将Task类型转换为F#异步工作流,这样就能借助F#的异步操作符和管道语法处理结果。 - 再通过
Async.map处理任务完成后的返回值,把原本独立的解析逻辑嵌入到异步工作流的转换流程中。 - 最后用
let!直接绑定处理后的最终结果到sValue,全程不会阻塞线程,符合异步编程的最佳实践。
如果使用的是F# 5及以上版本,还可以用更简洁的task表达式实现:
let! sValue = task { let! statementData = page.EvaluateAsync("() => this.window._StatementLinesData") return JObject.Parse(statementData.Value.GetRawText()).Last.Last |> (fun item -> item.Children()) |> Seq.map(fun item -> item.ToObject<StatementLine>()) }
内容的提问来源于stack exchange,提问作者Martin Thompson
相关产品推荐
相关产品推荐

