MaxLevs
@MaxLevs

Как грамотно реализовать обработку сразу нескольких обращений через «$.get»?

Предисловие
Есть база данных, доступ к которой осуществляется через скрипт /engine/ajax/comments.php. Туда передается 2 параметра методом get: cstart - номер листа с комментариями (от 1 и до бесконечности); news_id - номер "поста". Возвращает json, содержащий 2 поля: navigation - валидный html с ссылками на номера листов; comments - комментарии в виде валидного html. Если "вырвать" через RegExp id комментариев (например, если предварительно подрузить все комменты для одного поста ), то получим отсортированный массив неотрицательных чисел.

Задача
Найти номера листов, на которых расположен хотя бы один из трех id, при условии, что все 3 id точно присутствуют в комментах поста.

Шо имеем
Простой перебор - не вариант, ибо комментов может быть о-о-очень много. Решил делить пополам и определять область, в которой точно есть, но из-за незнания js на "должном уровне" столкнулся с рядом проблем, одна из которых - получить в одной функции сразу данные с 1, n и [n/2] листов, дабы хотя бы начать делить. Пытался поискать решение - информации слишком много, и я не могу понять, куда копать... По сути, мне нужно 3 раза обратиться к /engine/ajax/comments.php, и по получении всех 3 ответов, разобраться, что есть что, и обработать. Копипастить один и тот же код - не комельфо, хочется сделать по-нормальному, а то внутренний перфекционист задушит.

Знающие люди, подскажите и направьте, пожалуйста. Пишу userscript. Уже третий день.. Аж смешно...
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
@Sayonji
А в чем, собственно, проблема?
Пусть S(html, id) — функция, которая возвращает 0, если в html есть нужный id, -1 если он слева и +1 если справа.
Пусть GET(n, callback) — функция, которая скачивает страницу номер n и передает в коллбек.
Судя по вашей формулировке, вы не знаете номер последней страницы. В таком случае делаете бинарный поиск сначала вперед, а потом уже вглубь:

var _cached = {}
function G(n, callback) {
  // сразу всё будет кешировать, чтобы не париться с повторными проверками
  if (_cached[n])
    return _cached[n]
  GET(n, function (html) {
    _cached[n] = html
    callback(html)
  })
}

function searchUp(id, n, found) {
  // удваиваем номер страницы, пока не проскочим нужный id
  G(n, function(html) {
    var res = S(html, id);
    if (res == 0)
      found(n, html)
    else if (res > 0)
      searchUp(id, 2 * n, found)
    else
      searchBinary(id, n/2, n, found)
  })
}

function searchBinary(id, n1, n2, found) {
  // обычный бинарный поиск
  n = ((n1 + n2)/2)|0;
  G(n, function (html) {
    var res = S(html, id);
    if (res == 0)
      found(n, html)
    else if (res > 0)
      searchBinary(id, n, n2, found)
    else
      searchBinary(id, n1, n, found)
  })
}

searchUp(123, 1, function(n, html) {
  // Ищем 123 коммент, начинаем с 1 страницы
  console.log(n, html)
})
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы