优化异步查找算法

时间:2011-10-20 01:18:01

标签: javascript find coffeescript xmlhttprequest

我有一系列连续命名的网页(网址,如:http://example.com/book/1http://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.getevent.trigger是伪代码,目前是jQuery方法(但可能会改变)。 isValid也是伪代码,实际上是在函数中定义的测试,但它很复杂,与问题无关。

这很有效,但速度很慢,因为一次只处理一个请求。我正在寻找的是一种更好地利用XHR的异步性质并在更短的时间内检索完整列表的方法。有没有一种模式可以帮助我?还是更好的算法?

1 个答案:

答案 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