f# - 如何在 F# 的同一行上获取 Json 元素的字符串值
问题描述
我有一些代码我想放在同一行而不是单独的变量(也许是管道?)
let! creditText = row.EvalOnSelectorAsync("div.moneyout","node => node.innerText") |> Async.AwaitTask
let JSonElementString = creditText.Value.GetString()
我想要类似的东西:
let! creditText = row.EvalOnSelectorAsync("div.moneyout","node => node.innerText") |> Async.AwaitTask |> (fun js -> js.Value.GetString)
我可以看到正在发生的事情 - 在函数点,变量仍然是异步的。我怎样才能让它通过管道将结果传递给同一行上的函数?
解决方案
我不明白你为什么要这样做。当代码写成两行时,它是完全可读和简洁的。将其压缩为一行只会使其更难理解。
也就是说,如果您想这样做,最好的选择是对or进行map操作。这存在于各种库中,但您也可以轻松地自己定义它:Async<T>
Task<T>
module Async =
let map f a = async {
let! r = a
return f a }
使用它,您现在可以编写:
let! creditText =
row.EvalOnSelectorAsync("div.moneyout","node => node.innerText")
|> Async.AwaitTask
|> Async.map (fun creditText -> creditText.Value.GetString())
但正如我上面所说,我认为这是一个坏主意,你的两行版本更好。
推荐阅读
- javascript - 从 JSX 按钮调用另一个文件的类函数
- javascript - ReactJS - 使用 redux-saga 发送一个空对象
- selenium - 无法从网络日志中获取 HTTP 响应正文 - Selenium
- r - 将两个矩阵相乘时出现不一致的数组错误 (*%*)
- python - 通知不断发布到松弛频道
- node.js - 将 cookie 文件传入 curl 请求 nodejs
- sql - 根据最小和最大日期时间附加名称
- c# - 在 .net 核心中获取访问令牌
- java - JavaFX FileChooser 行为在组合扩展上不一致
- javascript - 将按钮的文本从“复制”转换为“已复制”,然后在几秒钟后返回“复制”