F#异步lambda与C#异步模型的互操作

c#

f#

我有这么一段代码(C#、Pulumi),我想把它翻译成 F#:

var registryInfo = repo.RegistryId.Apply(async (id) =>
        {
            var creds = await GetCredentials.InvokeAsync(new GetCredentialsArgs {RegistryId = id});
            var decodedData = Convert.FromBase64String(creds.AuthorizationToken);
            var decoded = ASCIIEncoding.ASCII.GetString(decodedData);

            var parts = decoded.Split(':');

            return new ImageRegistry
            {
                Server = creds.ProxyEndpoint,
                Username = parts[0],
                Password = parts[1],
            };
        });

到目前为止我设法做的是:

let registryInfo = repo.RegistryId.Apply (fun id -> async {
let! creds = GetCredentialsArgs ( RegistryId = id) |> GetCredentials.InvokeAsync |> Async.AwaitTask
let decodedData = Convert.FromBase64String creds.AuthorizationToken
let decoded = ASCIIEncoding.ASCII.GetString decodedData
let parts = decoded.Split ':'
return ImageRegistry( Server = input creds.ProxyEndpoint, Username= input parts.[0], Password = input parts.[1])
} 
) 

问题是上面的 F# 代码返回的是Output<Async<ImageRegistry>>,而 C# 代码返回的是 expected Output<ImageRegistry>。我正在从 C# 过渡到 F#(以扩展我的技能),但我自己无法处理这种情况。这应该如何正确完成?

回答

该库为此Pulumi.FSharp提供了一个有用的帮助Outputs.applyAsync程序:

open Pulumi.FSharp

let registryInfo =
    repo.RegistryId |>
    Outputs.applyAsync (fun id -> async {
        let! creds = GetCredentialsArgs ( RegistryId = id) |> GetCredentials.InvokeAsync |> Async.AwaitTask
        let decodedData = Convert.FromBase64String creds.AuthorizationToken
        let decoded = ASCIIEncoding.ASCII.GetString decodedData
        let parts = decoded.Split ':'
        return ImageRegistry( Server = input creds.ProxyEndpoint, Username= input parts.[0], Password = input parts.[1])
    })


以上是F#异步lambda与C#异步模型的互操作的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>