proc fetchAllAsync*(urls: seq[string]): Future[seq[string]] {.async.} =
var c = newAsyncHttpClient()
for url in urls:
debugEcho &"Before {url}"
result.add(await c.getContent(url))
debugEcho &"After {url}"
var feeds = @[
"https://pliutau.com/index.xml",
"https://www.avaxhome.biz/feed/",
"http://feeds2.feedburner.com/Ebookss",
"http://feeds.feedburner.com/IT-eBooks",
"http://feeds2.feedburner.com/librosvirtual",
"http://feeds.feedburner.com/wowebook",
"https://dev.to/feed/tag/nim"
]
let xmlFeeds = waitFor fetchAllAsync(feeds)
debugEcho $xmlFeeds.len
The result I am getting is:
Before https://pliutau.com/index.xml After https://pliutau.com/index.xml Before https://www.avaxhome.biz/feed/ After https://www.avaxhome.biz/feed/ Before http://feeds2.feedburner.com/Ebookss After http://feeds2.feedburner.com/Ebookss Before http://feeds.feedburner.com/IT-eBooks After http://feeds.feedburner.com/IT-eBooks Before http://feeds2.feedburner.com/librosvirtual After http://feeds2.feedburner.com/librosvirtual Before http://feeds.feedburner.com/wowebook After http://feeds.feedburner.com/wowebook Before https://dev.to/feed/tag/nim After https://dev.to/feed/tag/nim 7
And I expected something more like:
Before https://pliutau.com/index.xml Before https://www.avaxhome.biz/feed/ Before http://feeds2.feedburner.com/Ebookss After https://pliutau.com/index.xml Before http://feeds.feedburner.com/IT-eBooks After https://www.avaxhome.biz/feed/ After http://feeds2.feedburner.com/Ebookss Before http://feeds2.feedburner.com/librosvirtual Before http://feeds.feedburner.com/wowebook Before https://dev.to/feed/tag/nim After http://feeds.feedburner.com/IT-eBooks After https://dev.to/feed/tag/nim After http://feeds.feedburner.com/wowebook After http://feeds2.feedburner.com/librosvirtual 7
What am I missing?
You are blocking on each request with await
You probably want to do it like this:
proc fetchAllAsync*(urls: seq[string]): Future[seq[string]] {.async.} =
var
clients: seq[AsyncHttpClient]
futures: seq[Future[string]]
for i, url in urls:
clients.add newAsyncHttpClient()
debugEcho &"Before {url}"
futures.add(clients[i].getContent(url))
# debugEcho &"After {url}"
result = await all futures
debugEcho "all urls done"
var feeds = @[
"https://pliutau.com/index.xml",
"https://www.avaxhome.biz/feed/",
"http://feeds2.feedburner.com/Ebookss",
"http://feeds.feedburner.com/IT-eBooks",
"http://feeds2.feedburner.com/librosvirtual",
"http://feeds.feedburner.com/wowebook",
"https://dev.to/feed/tag/nim"
]
let xmlFeeds = waitFor fetchAllAsync(feeds)
debugEcho $xmlFeeds.len