【问题标题】:await generic Task and return the result等待通用任务并返回结果
【发布时间】:2021-03-12 21:51:58
【问题描述】:

我有函数调用

let result = session.Query<Domain.CustomerReadModel>().ToListAsync()

返回Task&lt;Collections.Generic.IReadOnlyList&lt;Domain.CustomerReadModel&gt;&gt;

如何在 F# 中正确“等待”此任务?

我试过了

async {
   session.Query<Domain.CustomerReadModel>().ToListAsync() |> ignore
}

还有

let result = session.Query<Domain.CustomerReadModel>().ToListAsync()
  |> Async.AwaitTask
  |> Async.RunSynchronously

这似乎可以编译,但我不能使用结果并返回它:

session.Query<Domain.CustomerReadModel>().ToListAsync()
    |> Async.AwaitTask
    |> Async.RunSynchronously

【问题讨论】:

    标签: f#


    【解决方案1】:

    Async.AwaitTask 接受任务,将其包装在 async 计算中,然后返回该计算。拥有它后,您可以将其与 let!do!return! 一起使用,就像任何其他 async 计算一样。

    async {
      let queryAsFsharpAsync = session.Query<Domain.CustomerReadModel>().ToListAsync() |> Async.AwaitTask
      let! result = queryAsFsharpAsync 
      ...
    }
    

    或者不给计算自己的名字:

    async {
      let! result = session.Query<Domain.CustomerReadModel>().ToListAsync() |> Async.AwaitTask
      ...
    }
    

    【讨论】:

    • 这导致FSharpAsync&lt;IReadOnlyList&lt;Domain.CustomerReadModel&gt;&gt;。如何从中获取IReadOnlyList&lt;Domain.CustomerReadModel
    • FSharpAsync&lt;...&gt; 的确切结果是什么?
    • 尝试返回!而不是让! ?
    • result 的类型为 FSharpAsync&lt;...&gt;。我现在在调用函数(在 Giraffe 处理程序内)中解决了这样的问题:let customers = EventStore.loadCustomerProjections |&gt; Async.RunSynchronously。不知道这是否是我这样做的正确方式。
    • 这不可能。 result 不能是 FSharpAsync&lt;...&gt; 类型。您确定您使用的是let! 而不是let
    猜你喜欢
    • 2017-06-02
    • 2019-06-22
    • 1970-01-01
    • 2013-08-06
    • 2019-10-07
    • 2015-10-06
    • 1970-01-01
    • 2017-02-20
    • 2014-10-01
    相关资源
    最近更新 更多