El libro continúa la última vez, necesitamos modificar el programa para rastrear el contenido de 40 páginas seguidas. Es decir, necesitamos generar el título, el enlace, el primer comentario, el usuario del comentario y los puntos del foro de cada artículo.
Como se muestra en la figura, el valor obtenido $('.reply_author').eq(0).text().trim(); es el usuario correcto de primer comentario.
{<1>}
Después de recibir comentarios y contenido de nombre de usuario en EventProxy, necesitamos saltar a la interfaz de usuario a través del nombre de usuario para continuar rastreando los puntos de usuario
La copia del código es la siguiente:
var $ = quese.load (topichtml);
// Esta URL es el siguiente paso para rastrear la URL objetivo
var userHref = 'https://cnodejs.org' + $ ('.
userHref = url.resolve (turl, userhref);
VAR Title = $ ('. Topic_full_title'). Text (). Trim (). Reemplazar (// n/g, "") ;;
var href = topicUrl;
var comentar1 = $ ('.
var author1 = $ ('.
// pasar los parámetros al siguiente rastreo concurrente
ep.emit ('user_html', [userhref, title, href, comment1, autor1]);
En EventProxy esta vez, queremos encontrar dónde se coloca el puntaje (class = "grande").
{<2>}
Solo busque el nombre de clase, intentemos generar el resultado primero
La copia del código es la siguiente:
VAR Resultado = Superagent.get (UserUrl)
.end (function (err, res) {
if (err) {
return console.error (err);
}
var $ = Cheese.load (res.text);
Var stork = $ ('. Big'). Text (). Trim ();
console.log (usuario [1]);
console.log (usuario [2]);
console.log (usuario [3]);
console.log (usuario [4]);
console.log ($ ('. Big'). Text (). Trim ());
devolver ({
Título: usuario [1],
href: usuario [2],
Comentario1: usuario [3],
Autor1: usuario [4],
Puntuación1: Puntuación
});
});
});
Ejecute el programa y el resultado se obtiene por este código.
{<3>}
Pero el problema es que podemos generar el resultado correctamente en la función de devolución de llamada de .end (), pero no podemos generar el resultado correctamente. Si mira de cerca, la salida que debe ser emitida es un objeto de solicitud. Esto se debe a errores descuidados. La función .end () no pasa el valor de retorno al objeto de solicitud y debe devolver el resultado a la capa anterior (usuarios).
La copia del código es la siguiente:
// Encuentra a UserDetails
ep.After ('user_html', topicUrls.length, function (usuarios) {
users = users.map (function (usuario) {
var userUrl = user [0];
puntaje var;
Superagent.get (UserUrl)
.end (function (err, res) {
if (err) {
return console.error (err);
}
//console.log(res.text);
var $ = Cheese.load (res.text);
Score = $ ('. Big'). Text (). Trim ();
});
devolver ({
Título: usuario [1],
href: usuario [2],
Comentario1: usuario [3],
Autor1: usuario [4],
Puntuación1: Puntuación
});
});
Los usuarios de exportación bien y encuentran que aparte de Score1 son los valores correctos. Después de una cuidadosa depuración, descubrí que el programa primero realizó console.log () y luego realizó .map (). Más precisamente, dentro de la función .map (), la función de devolución de llamada .get () no completa la puntuación de asignación, y se lleva a cabo el valor de retorno de retorno. Esta es la función de devolución de llamada asíncrona, y la operación síncrona externa no esperará a que la función de devolución de llamada complete la operación.
{<4>}
Mi enfoque es emitir otra capa de mensaje y pasar los datos requeridos a la operación del mensaje receptor junto con el mensaje. After (), solo cuando se reciban todos los mensajes se imprimirán los parámetros aprobados (resultado).
La copia del código es la siguiente:
Score = $ ('. Big') text (). Trim ();
// recién agregado
ep.emit ('got_score', [usuario [1], usuario [2], usuario [3], usuario [4], puntaje]);
.....
ep.After ('got_score', 10, function (usuarios) {
console.log (usuarios);
});
{<6>}
Este problema se ha resuelto, pero el valor de Score1 parece ser demasiado grande. Después de mirar nuevamente, resulta que hay dos class = 'Big', y la colección de temas del usuario también pertenece a esta clase. Tenemos que cortar el primer elemento a través de Cheerio. El resultado correcto se muestra en la figura.
{<7>}