Книга продолжается в прошлый раз, нам нужно изменить программу, чтобы ползти содержимого 40 страниц подряд. То есть нам нужно вывести название, ссылку, первый комментарий, комментарий пользователя и точки на форуме каждой статьи.
Как показано на рисунке, значение, полученное $('.reply_author').eq(0).text().trim(); это правильный пользователь первого комментария.
{<1>}
После получения комментариев и контента имени пользователя в EventProxy нам нужно перейти на пользовательский интерфейс через имя пользователя, чтобы продолжить ползти пользовательских точек
Кода -копия выглядит следующим образом:
var $ = cheese.load (topichtml);
// Этот URL является следующим шагом для ползания целевого URL
var userHref = 'https://cnodejs.org' + $ ('. reply_author'). eq (0) .attr ('href');
userHref = url.resolve (turl, userHref);
var title = $ ('.
var href = tomaUrl;
var comment1 = $ ('. reply_content'). eq (0) .text (). trim ();
var Author1 = $ ('. Reply_author'). EQ (0) .Text (). Trim ();
// передавать параметры следующему параллельному ползу
ep.emit ('user_html', [userHref, title, href, comment1, Author1]);
На этот раз в EventProxy мы хотим найти, где находится счет (Class = "Big").
{<2>}
Просто найдите имя класса, давайте сначала постараемся вывести результат
Кода -копия выглядит следующим образом:
var nuctome = superagent.get (userUrl)
.end (function (err, res) {
if (err) {
return console.error (err);
}
var $ = cheese.load (res.text);
var score = $ ('. big'). text (). trim ();
console.log (пользователь [1]);
console.log (пользователь [2]);
console.log (пользователь [3]);
console.log (пользователь [4]);
console.log ($ ('. Big'). Text (). Trim ());
возвращаться ({
Название: Пользователь [1],
href: пользователь [2],
Комментарий1: Пользователь [3],
Автор1: Пользователь [4],
Оценка1: оценка
});
});
});
Запустите программу, и результат получен этим кодом.
{<3>}
Но проблема в том, что мы можем правильно вывести результат в функции обратного вызова .END (), но мы не можем правильно вывести результат. Если вы посмотрите внимательно, вывод, который должен быть вывод, является объектом запроса. Это из -за небрежных ошибок. Функция .end () не передает возвращаемое значение объекту запроса и должна вернуть результат на предыдущий уровень (пользователи).
Кода -копия выглядит следующим образом:
// Найти пользовательские данные
ep.after ('user_html', topenurls.length, function (users) {
users = users.map (function (user) {
var userurl = user [0];
var score;
superagent.get (userurl)
.end (function (err, res) {
if (err) {
return console.error (err);
}
//console.log(res.text);
var $ = cheese.load (res.text);
счет = $ ('. Big'). Text (). Trim ();
});
возвращаться ({
Название: Пользователь [1],
href: пользователь [2],
Комментарий1: Пользователь [3],
Автор1: Пользователь [4],
Оценка1: оценка
});
});
Хорошо экспортируйте пользователей и обнаружите, что, кроме оценки1, являются правильными значениями. После тщательной отладки я обнаружил, что программа сначала выполнила console.log (), а затем выполнила .map (). Точнее, в функции .map () функция обратного вызова .get () не завершает оценку назначения, и возвращаемое значение выполняется. Это асинхронная функция обратного вызова, и внешняя синхронная операция не будет ждать, пока функция обратного вызова завершит операцию.
{<4>}
Мой подход состоит в том, чтобы излучать еще один уровень сообщения и передать необходимые данные в операцию приемного сообщения вместе с сообщением. После (), только после получения всех сообщений будут распечатаны падебные параметры (результат).
Кода -копия выглядит следующим образом:
счет = $ ('. Big') text (). trim ();
// вновь добавлено
ep.emit ('got_score', [пользователь [1], пользователь [2], пользователь [3], пользователь [4], оценка]);
.....
ep.after ('got_score', 10, function (пользователи) {
console.log (пользователи);
});
{<6>}
Эта проблема была решена, но значение оценки1 кажется слишком большой. Посмотрев еще раз, оказывается, что есть два класса = «Большой», и коллекция тем пользователя также принадлежит этому классу. Мы должны сократить первый элемент с помощью Cheerio .slice (Start, [End]) и изменить оценку, чтобы оценки = $ ('. Правильный результат показан на рисунке.
{<7>}