假设我有两个async
函数:
fetchCategories
获取产品类别列表(string List
)fetchProductsForCategory
获取给定类别(string List
)的产品列表
我想写一个函数fetchProducts
,获取所有类别的所有产品。结果应该是一个元组列表(string * string List
)。
然而,我现在还不确定是否将async
和Seq.collect
放在一起。
这是我的尝试,希望能让你明白我的意图:
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
}
发布于 2018-06-02 04:06:45
实现你想要的最直接的方法是简单地连续运行所有的fetchProductsForCategory
,一个接一个,然后连接它们的结果。为了在运行下一次执行之前等待前一次执行完成,请使用Async.RunSynchronously
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
函数接受一系列异步计算,并行运行它们,并以数组的形式返回结果:
let fetchProducts () = async {
let! categories = fetchCategories ()
let! products = categories
|> Seq.map fetchProductsForCategory
|> Async.Parallel
Seq.zip categories products
}
https://stackoverflow.com/questions/50650067
复制相似问题