Асинхронное командование в басне Эльмиш

У меня есть этот код, который я использую, используя Fable Elmish и Fable remoting для подключения к Suave серверу. Я знаю, что сервер работает из-за почтальона, и есть варианты этого кода, который вызывает сервер

 let AuthUser model : Cmd<LogInMsg> =
        let callServer = async {
                let! result = server.RequestLogIn model.Credentials
                return result
            }
        let result = callServer |> Async.RunSynchronously
        match result with
        | LogInFailed x -> Cmd.ofMsg (LogInMsg.LogInRejected x) 
        | UserLoggedIn x -> Cmd.ofMsg (LogInMsg.LogInSuccess x)

callServer строка в результате let терпит неудачу с Object(...) is not a functionно я не понимаю почему. Любая помощь будет оценена.

1 ответ

Решение

Согласно Fable Docs Async.RunSynchronously не поддерживается, хотя я не уверен, является ли это причиной вашей проблемы. В любом случае вы должны структурировать свой код так, чтобы вам не нужно было блокировать асинхронные вычисления. В случае с Elmish вы можете использовать Cmd.ofAsync создать из асинхронной команды команду, которая отправляет сообщения, возвращаемые асинхронной программой после ее завершения.

let AuthUser model : Cmd<LogInMsg> =
    let ofSuccess result =
        match result with
        | LogInFailed x -> LogInMsg.LogInRejected x
        | UserLoggedIn x -> LogInMsg.LogInSuccess x
    let ofError exn = (* Message representing failed HTTP request *) 
    Cmd.ofAsync server.RequestLogIn model.Credentials ofSuccess ofError

Надеюсь, это поможет.

Другие вопросы по тегам