Я новичок в Node.js и обещает (здесь я использую Q.js). Я пытаюсь сделать скребок из сайта, который имеет следующую структуру:JQuery асинхронные обещания с вложенными циклами
- main_page: имеет список категорий, каждая категория имеет ссылку, указывающую на странице список магазинов.
- список магазинов страница: есть список магазинов, каждый магазин имеет ссылку, указывающую на страницу сведений о магазине.
- магазин подробно страница: есть данные, которые я ищу.
Я сделал первый рабочий подход без обещаний, но в результате код был очень уродливым. Поэтому я считаю, что это хороший случай для использования обещаний.
Я не могу заставить этот подход работать. Когда выполняется второй цикл, приложение не продолжит (он никогда не выполняет метод end()). Кроме того, я не знаю, как подключить третий цикл.
Как я мог это сделать?
function get(url) {
var deferred = Q.defer();
requestify.get(url).then(function(response) {
deferred.resolve(cheerio.load(response.getBody()));
});
return deferred.promise;
}
function process_main_page($) {
var promises = [];
$('.categories a').each(function(i) {
var deferred = Q.defer();
var storesList = $('.store');
get($(this).attr('href')).then(function($) {
deferred.resolve(process_stores_list(storesList));
});
promises.push(deferred);
});
return Q.all(promises);
}
function process_stores_list(storesList) {
var promises = [];
storesList.each(function() {
// Here I need to make another ajax call for each store detail page, which has the data that I need.
promises.push(deferred);
});
return Q.all(promises);
}
function end(res) {
var deferred = Q.defer();
fs.writeFile('output.json', JSON.stringify(myGatheredData, null, 4), function(err) {
deferred.resolve(function() {
res.send('File successfully written! - Check your project directory for the output.json file');
});
});
return deferred.promise;
}
app.get('/', function(req, res) {
get(url).then(process_main_page).then(end);
});
http: // jsfiddle.net/arunpjohny/v917j5ec/5/ –
Ваш код заполнен отложенным анти-шаблоном :(Подумайте об этом и закрепите его. –