А в чем, собственно, проблема?
Пусть 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)
})