gpt4 book ai didi

f# - 从 Fable.Remoting 返回异步值

转载 作者:行者123 更新时间:2023-12-03 15:13:31 26 4
gpt4 key购买 nike

这是一个客户端 Fable.Remoting 示例,用于打印异步函数的结果。

    // Client code (Compiled to Javascript using Fable)
// ============
open Fable.Remoting.Client

let server = Proxy.create<IServer>

async {
let! length = server.getLength “hello”
do printfn “%d” length // 5
}
|> Async.StartImmediate

我如何获得 length值(value)?

最佳答案

我看到你用 标记了你的问题,所以我假设你有一个 Msg类型定义。不要使用 Async.StartImmediateAsync.RunSynchronously ;在 Elmish 中,你应该使用 Cmd.OfAsync 安排在异步块返回值后调度消息。 Cmd.OfAsync中有四个功能(同样的四个也出现在 Cmd.OfPromise 中):either , perform , attempt , 和 result .我会为你分解它们,因为他们的文档还不够完善:

  • either : 需要四个参数,task , arg , ofSuccess , 和 ofError . task是您要调用的异步函数(类型为 'a -> Async<'b> )。 arg是类型 'a 的参数您想传递给 task功能。 ofSuccess'b -> 'Msg 类型的函数:它将接收异步函数的结果,并应该创建一条消息,大概是包含 'b 的消息。结果。最后,ofErrorexn -> 'Msg 类型的函数: 如果 task函数抛出异常,然后 ofError将被调用而不是 ofSuccess ,并且应该将该异常转换为您的代码可以处理的 Elmish 消息(大概是一个将错误记录到 Javascript 控制台或弹出带有 Thoth.Toast 或类似内容的通知的消息)。
  • perform : 喜欢 either但没有 ofError范围。如果您的异步命令不会失败(远程 API 调用永远不会出现这种情况,因为网络总是有可能出现故障或您的服务器没有响应),或者如果您只是不关心异常并且不介意,请使用此选项抛出未处理的异常。
  • attempt : 喜欢 either但没有 ofSuccess参数,所以 task如果成功,函数的结果将被忽略。
  • result : 这个完全不一样。它只需要一个 Async<'Msg> 类型的参数,即您传递给它 async已经将产生消息的块。

  • 使用您编写的代码,您将使用 Cmd.OfAsync.result如果您想对代码进行最少的更改,但我建议您使用 Cmd.OfAsync.perform取而代之(并在编写了一些错误处理代码后将其升级到 Cmd.OfAsync.either)。我将向您展示两种方式:
    type Msg =
    // ... rest of your messages go here
    | GetLength of string
    | LengthResult of int

    let update msg model =
    match msg with
    // ... rest of your update function
    | GetLength s ->
    let usePerform = true
    if usePerform then
    model, Cmd.OfAsync.perform server.getLength s LengthResult
    else
    let length : Async<Msg> = async {
    let! length = server.getLength s
    return (LengthResult length)
    }
    model, Cmd.OfAsync.result length
    | LengthResult len ->
    // Do whatever you needed to do with the API result
    printfn "Length was %d" len
    model, Cmd.none

    如果您使用的是 either (一旦你进入生产,你真的应该这样做),会有第三条消息 LogError of exn这将被处理为:
        | LogError e ->
    printfn "Error: %s" e.Message
    model, Cmd.none

    Cmd.OfAsync.perform上面代码中的行将变为:
            model, Cmd.OfAsync.either server.getLength s LengthResult LogError

    这是在 Elmish 中处理异步生成函数的正确方法。

    关于f# - 从 Fable.Remoting 返回异步值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57619894/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com