【发布时间】:2021-10-20 18:53:24
【问题描述】:
在以下代码中:
let! _ =
connection
|> Sql.existingConnection
|> Sql.query $"LISTEN \"{accountId}.{notificationName}\""
|> Sql.executeNonQueryAsync
我忽略了结果,我认为我可以用 do! 语句替换它,但是:
do!
connection
|> Sql.existingConnection
|> Sql.query $"LISTEN \"{accountId}.{notificationName}\""
|> Sql.executeNonQueryAsync
不会编译:
这个表达式应该有类型'int',但这里有类型'unit'
并在末尾添加 |>ignore 并不能解决问题。这样做的正确方法是什么?
编辑:
这里是完整的代码:
// start a loop, waiting for events
async {
try
// create a connection
use connection = getConnection location
// add the callback
connection.Notification.Add (fun x -> callback (JObject.Parse x.Payload).["data"])
// listen to the notifications
let! _ =
connection
|> Sql.existingConnection
|> Sql.query $"LISTEN \"{accountId}.{notificationName}\""
|> Sql.executeNonQueryAsync
// loop for events
while true do
try
do! connection.WaitAsync()
with ex ->
error ex.Message
Thread.Sleep(TimeSpan.FromSeconds(2.))
with ex ->
failwith $"{ex.Message}"
}
|> Async.StartAsTask
|> ignore
问题函数 (Sql.executeNonQueryAsync) 来自此库:https://github.com/Zaid-Ajaj/Npgsql.FSharp/blob/50d3409fec844526e3c44901d64c8361b09e42a3/src/Npgsql.FSharp.fs(它是该文件的最后一个函数)
该库是围绕 Postgres 的 SQL 客户端的 F# 包装器。
【问题讨论】:
-
你试过
Async.Ignore吗? -
是的,它给了我错误:无法根据此程序点之前的类型信息确定方法“源”的唯一重载。可能需要类型注释。
-
很难说。我不知道这些类型是什么,所以它只是在黑暗中拍摄,没有可重现的东西。
-
@PhillipCarter,最后一次调用返回一个Task
;但是,是的,这对我来说似乎很奇怪。 -
如果你想得到这个答案,你需要指定
Sql模块是什么(一些库?),你到底在哪里得到错误(哪一行?)以及什么是您正在使用的计算表达式生成器(任务还是异步?)没有这个,就不可能知道...
标签: f#