我有一系列连续命名的网页(网址,如:http://example.com/book/1,http://example.com/book/2等),但我无法提前知道有多少页面。我需要检索每个页面的(特定部分),保持所获得的信息顺序,错过任何页面,并请求最少量的空页。
目前,我有一个递归异步函数,有点像这样:
pages = []
getPage = (page = 1) ->
xhr.get "http://example.com/book/#{1}", (response) ->
if isValid response
pages.push response
getPage page++
else
event.trigger "haveallpages"
getPage()
xhr.get
和event.trigger
是伪代码,目前是jQuery方法(但可能会改变)。 isValid
也是伪代码,实际上是在函数中定义的测试,但它很复杂,与问题无关。
这很有效,但速度很慢,因为一次只处理一个请求。我正在寻找的是一种更好地利用XHR的异步性质并在更短的时间内检索完整列表的方法。有没有一种模式可以帮助我?还是更好的算法?
答案 0 :(得分:2)
只需同时发出请求,同时保持计数。无需猜测上限,只需在请求开始失败时停止,就像在原始代码中一样。
这最多会产生concurrency-1
个浪费的请求:
pages = []
concurrency = 5
currentPage = 0
haveAllPages = false
getPage = (p) ->
xhr.get "http://example.com/book/#{p}", (response) ->
if isValid response
pages.push response
getPage ++currentPage if not haveAllPages
else
haveAllPages = true
while concurrency--
getPage ++currentPage