首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用异步转换函数进行Seq.collect?

如何使用异步转换函数进行Seq.collect?
EN

Stack Overflow用户
提问于 2018-06-02 03:39:04
回答 1查看 256关注 0票数 2

假设我有两个async函数:

  • fetchCategories获取产品类别列表(string List)
  • fetchProductsForCategory获取给定类别(string List)

的产品列表

我想写一个函数fetchProducts,获取所有类别的所有产品。结果应该是一个元组列表(string * string List)。

然而,我现在还不确定是否将asyncSeq.collect放在一起。

这是我的尝试,希望能让你明白我的意图:

代码语言:javascript
复制
let fetchProducts () = async {
  let! categories = fetchCategories ()
  return categories
    |> Seq.collect (fun c -> async {
      let! products = fetchProductsForCategory c
      return products
        |> Seq.map fun p -> (c, p)
    })
    |> Seq.toList
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 04:06:45

实现你想要的最直接的方法是简单地连续运行所有的fetchProductsForCategory,一个接一个,然后连接它们的结果。为了在运行下一次执行之前等待前一次执行完成,请使用Async.RunSynchronously

代码语言:javascript
复制
let fetchProducts () = async {
  let! categories = fetchCategories ()
  return categories
    |> Seq.collect (fun c ->
      fetchProductsForCategory c 
        |> Async.RunSynchronously          
        |> Seq.map (fun p -> (c, p))
    )
    |> Seq.toList
}

(请注意,顺便说一句,您的代码生成的不是您所期望的Seq<string * string list>,而是Seq<string * string> -每个产品都有它的类别;但这不是重点)

然而,这种方法有一个明显的缺点,那就是浪费宝贵的时间。fetchProductsForCategory的执行可以并行运行,从而获得更好的性能。

注意:有一款应用程序可以做到这一点。Async.Parallel函数接受一系列异步计算,并行运行它们,并以数组的形式返回结果:

代码语言:javascript
复制
let fetchProducts () = async {
  let! categories = fetchCategories ()
  let! products = categories 
                   |> Seq.map fetchProductsForCategory 
                   |> Async.Parallel

  Seq.zip categories products
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50650067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档