1

ユニットを返すサーバーメソッドへのRPC呼び出しがメッセージパッシング呼び出しであることを知っているので、呼び出しを強制的に非同期にし、最初の呼び出しがサーバーに送信された後にのみ次のサーバー呼び出しを起動できるようにします。

サーバーコード:

[<Rpc>]
let FirstCall value =
    printfn "%s" value
    async.Zero()

[<Rpc>]
let SecondCall() =
    "test"

クライアントコード:

|>! OnClick (fun _ _ -> async {
                            do! Server.FirstCall "test"
                            do Server.SecondCall() |> ignore
                        } |> Async.Start)

ユニットを返し、サーバーとクライアントのコードを次のように置き換えてから、これはクライアントでクラッシュするようです。

[<Rpc>]
let FirstCall value =
    printfn "%s" value
    async { return () }

let! _ = Server.FirstCall "test"

問題は修正されませんでしたが、次の問題は修正されました。

[<Rpc>]
let FirstCall value =
    printfn "%s" value
    async { return "" }

let! _ = Server.FirstCall "test"

代わりに、メッセージパッシング呼び出しを強制的に非同期にする別の方法はありますか?

4

1 に答える 1

2

これは間違いなくバグです。ここに追加しました:

https://bugs.intellifactory.com/websharper/show_bug.cgi?id=468

あなたのアプローチは完全に合法です。回避策もおそらく今のところ最善です。たとえば、ゼロでAsync<unit>returnを返し、それを無視する代わりに。Async<int>

来週に予定されている2.4リリースの準備で忙しく、修正によりリリースされる予定です。ありがとう!

また、2.4では同期呼び出しを削除するため、 https://bugs.intellifactory.com/websharper/show_bug.cgi?id = 467で説明されているように、RPC全体でAsyncを使用する必要があります。同期AJAXをサポートしない新しいターゲット(AndroidおよびWP7)。

于 2011-08-06T15:55:06.873 に答える