asynchronous - F# 异步条件分支

标签 asynchronous f#

我有一个有条件地调用异步任务的方法:

let processMsg (msg : SocketMessage) =
    task{
        //....
        //....
        let user =
            if msg.User.IsSpecified && (msg.User.Value :? IUser) then
                user.Value :?> IUser
            else
                //Compiler: This construct may only be used within a computation expression
                let! user' = rest.GetUserAsync(UserId, config.restOptions)
                user'
        //....
        //....
    }

编译器提示我必须在计算表达式内。我以为我是。我让它工作的唯一方法是将其拆分为异步子方法:

let getUserAsync (user : SocketUser) =
    task{
        if user.IsSpecified && (user.Value :? IUser) then
            return user.Value :?> IUser
        else
            let! user' =
                rest.GetUserAsync(UserId, config.restOptions)
            return (user' :> IUser)
    }

现在我有一个额外的异步上下文来处理罕见的极端情况。有没有更好的方法来处理这个问题?

最佳答案

let user = ...的内部是不是计算表达式。 let它本身位于计算表达式内部,但其内部的任何内容都不是。所以你不能使用let!在那里。

做你想做的事情的方法是将其变成 let进入let!然后确保其右侧是 Task :

    let! user =
        if msg.User.IsSpecified && (msg.User.Value :? IUser) then
            Task.FromResult(user.Value :?> IUser)
        else
            rest.GetUserAsync(UserId, config.restOptions)

关于asynchronous - F# 异步条件分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64861689/

相关文章:

f# - 如何在 F# 中的字符串中查找子字符串?

javascript - 在 Angular Controller 中处理异步更新的正确方法

javascript - jquery 函数不适用于异步加载的 dom 元素

asynchronous - 异步工作流和尝试/使用的 F# 问题

f# - 如何为所提供的方法提供带有静态参数的返回类型

python - 在 Deedle 中使用默认值将列添加到数据框

python - 有人在做异步数据库提交吗?

javascript - 异步函数完成后执行代码

f# - 在 F# 中,当调用的函数有多个参数时如何使用 list.filter ?

arrays - fold 反转序列的顺序