Пока лучшее, что удалось нагородить... использование очереди из async не по назначению, и request c timeout.
Такой вариант отрабатывает каждую секунду определенное кол-во запросов, но если случаются проблемы во время запроса, то вообще все падает с `max call stack` в async-е.
Вот этот говнокод:
var q = async.queue(function (page, callback) {
scrapeArticles(page);
callback();
}, 2);
q.drain = function() {
console.log('All items have been processed');
}
function scrapeArticleLinks(category) {
for (var i = 1; i <= category.pages; i++) {
var page = BASE_URL + category.href + '?page=' + i;
q.push(page, function (err) {
if (err) {
console.error('Error while processing ' + page);
}
});
}
}
var counter = 0;
function scrapeArticles(page) {
counter++;
setTimeout(function() {
request(page, function(error, response, body) {
if (!error) {
console.log(body);
} else {
console.error('Error while requesting ' + page);
}
});
}, 1000 * counter);
}
Должно быть какое-то решение проще в мире асинхронного программирования, наверное.