В Stack есть несколько подобных вопросов, но я не могу получить ответы на все вопросы, я совершенно новичок в Node и идею асинхронного программирования, поэтому, пожалуйста, несите меня.Создание асинхронного цикла while в узлеJS
Я строю скребок, который в настоящее время имеет процесс 4 шага:
- Я даю ей коллекцию ссылок
- Он идет к каждому из этих ссылок, находит все соответствующие
img src
на странице - Он находит ссылку «следующая страница», получает ее
href
, извлекает дом из указанногоhref
и повторяет шаг №2. - Все эти
img src
помещаются в массив и вернулся
Вот код. getLinks
можно назвать асинхронно, но while
цикл в нем в настоящее время не может:
function scrape(url, oncomplete) {
console.log("Scrape Function: " + url);
request(url, function(err, resp, body) {
if (err) {
console.log(UHOH);
throw err;
}
var html = cheerio.load(body);
oncomplete(html);
}
);
}
function getLinks(url, prodURL, baseURL, next_select) {
var urls = [];
while(url) {
console.log("GetLinks Indexing: " + url);
var html = scrape(url, function(data) {
$ = data;
$(prodURL).each(function() {
var theHref = $(this).attr('href');
urls.push(baseURL + theHref);
}
);
next = $(next_select).first().attr('href');
url = next ? baseurl + next : null;
}
);
}
console.log(urls);
return urls;
}
В настоящее время это входит в бесконечный цикл, не очищая ничего. Если я положил url = next ? baseurl + next : null;
за пределы обратного вызова, я получаю ошибку "next" is not defined
.
Любые идеи о том, как я могу переделать это, чтобы сделать его удобным для узлов? Похоже, что по этой самой природе проблема должна быть блокирующей, нет?
Повторите цикл while как рекурсивную функцию. Затем вы легко узнаете, как сделать это асинхронным путем передачи обратных вызовов. – Bergi
@ Bergi Ah, оказывается, мне просто нужно было знать имя, и я мог бы сам это решить. Для тех, кто наткнулся на это: http://tech.richardrodger.com/2011/04/21/node-js-%E2%80%93-how-to-write-a-for-loop-with-callbacks/является хорошим ресурсом – Jascination