Оптимизация алгоритма асинхронного поиска - PullRequest
3 голосов
/ 20 октября 2011

У меня есть ряд последовательно названных страниц (URL-адреса, такие как: 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 и получить полный список за меньшее время. Есть ли образец, который мог бы помочь мне здесь? Или лучший алгоритм?

1 Ответ

2 голосов
/ 20 октября 2011

Просто запускайте одновременные запросы, сохраняя их количество. Нет необходимости угадывать верхнюю границу, просто остановитесь, когда запросы начнут давать сбой, как в исходном коде.

Это будет генерировать не более 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...