如果您有很多要调用的URL,那么F#中是否存在任何具有某种限制的队列模式,例如,在继续下一批之前,一次说5或10次调用。
let urls = [
"http://example.com/1",
"http://example.com/2",
"http://example.com/3",
....
"http://example.com/100"]
传递函数以调用
let getAsync (url:string) =
async {
let httpClient = new System.Net.Http.HttpClient()
let! response = httpClient.GetAsync(url) |> Async.AwaitTask
response.EnsureSuccessStatusCode () |> ignore
let! content = response.Content.ReadAsStringAsync() |> Async.AwaitTask
return content
}
然后会收到所有结果和任何错误的列表,因为某些调用可能会因404或500错误等原因而失败。
答案 0 :(得分:1)
首先,让您的函数实际返回错误信息,而不是将其作为异常抛出:
let getAsync url : Result<_,_> =
async {
try
...
return (Ok content)
with ex ->
return (Error ex)
}
然后使用Async.Parallel
并行执行它们。此函数使用list<Async>
并返回Async<list>
:
let allResults = urls |> List.map getAsync |> Async.Parallel