O livro continua da última vez, precisamos modificar o programa para rastejar o conteúdo de 40 páginas seguidas. Ou seja, precisamos gerar o título, link, primeiro comentário, comentários e pontos de fórum de cada artigo.
Conforme mostrado na figura, o valor obtido $('.reply_author').eq(0).text().trim(); é o usuário correto do primeiro comentário.
{<1>}
Depois de receber comentários e conteúdo de nome de usuário no EventProxy, precisamos pular para a interface do usuário através do nome de usuário para continuar rastejando os pontos do usuário
A cópia do código é a seguinte:
var $ = cheeseio.load (topichtml);
// Este URL é o próximo passo para rastejar o URL de destino
var userHref = 'https://cnodejs.org' + $ ('. Responder_author'). Eq (0) .attr ('href');
userhref = url.resolve (turl, userHref);
var title = $ ('. tópico_full_title'). text (). TRIM (). Substitua (// n/g, "") ;;
var href = tópico;
var comentário1 = $ ('. Responder_content'). Eq (0) .Text (). TRIM ();
var autor1 = $ ('. Responder_author'). Eq (0) .Text (). TRIM ();
// Passe os parâmetros para o próximo rastreamento simultâneo
ep.emit ('user_html', [userhref, título, href, comentário1, autor1]);
Desta vez, no EventProxy, queremos descobrir onde a pontuação é colocada (class = "big").
{<2>}
Basta encontrar o nome da classe, vamos tentar produzir o resultado primeiro
A cópia do código é a seguinte:
VAR ALGUNDO = SuperAgent.get (UserURL)
.nd (function (err, res) {
if (err) {
retornar console.error (err);
}
var $ = Cheeseio.load (res.text);
var score = $ ('. Big'). text (). TRIM ();
console.log (usuário [1]);
console.log (usuário [2]);
console.log (usuário [3]);
console.log (usuário [4]);
console.log ($ ('. big'). text (). TRIM ());
retornar ({
Título: Usuário [1],
href: usuário [2],
Comentário1: Usuário [3],
Autor1: Usuário [4],
pontuação1: pontuação
});
});
});
Execute o programa e o resultado é obtido por este código.
{<3>}
Mas o problema é que podemos gerar o resultado corretamente na função de retorno de chamada do .END (), mas não podemos produzir o resultado corretamente. Se você olhar de perto, a saída que precisa ser emitida é um objeto de solicitação. Isso ocorre por causa de erros descuidados. A função .END () não passa o valor de retorno para o objeto de solicitação e precisa retornar o resultado à camada anterior (usuários).
A cópia do código é a seguinte:
// Encontre userDetails
ep.after ('user_html', tópicos.length, function (usuários) {
usuários = usuários.map (function (usuário) {
var userurl = usuário [0];
pontuação var;
SuperaGent.get (UserURL)
.nd (function (err, res) {
if (err) {
retornar console.error (err);
}
//console.log(res.text);
var $ = Cheeseio.load (res.text);
pontuação = $ ('. grande'). Texto (). TRIM ();
});
retornar ({
Título: Usuário [1],
href: usuário [2],
Comentário1: Usuário [3],
Autor1: Usuário [4],
pontuação1: pontuação
});
});
Exportar bem os usuários e descobrir que além do SCORE1 são os valores corretos. Após uma depuração cuidadosa, descobri que o programa realizou o console.log () e depois executou .Map (). Mais precisamente, dentro da função .map (), a função .get () não preenche a pontuação da atribuição e o valor de retorno de retorno é realizado. Esta é a função de retorno de chamada assíncrona, e a operação síncrona externa não aguarda a função de retorno de chamada concluir a operação.
{<4>}
Minha abordagem é emitir outra camada de mensagem e passar os dados necessários para a operação de mensagem de recebimento junto com a mensagem. Depois (), somente quando todas as mensagens são recebidas serão impressas nos parâmetros aprovados (resultado).
A cópia do código é a seguinte:
pontuação = $ ('. big') text (). TRIM ();
// recém -adicionado
ep.emit ('Got_Score', [Usuário [1], Usuário [2], Usuário [3], Usuário [4], Score]);
.....
ep.after ('got_score', 10, function (usuários) {
console.log (usuários);
});
{<6>}
Esse problema foi resolvido, mas o valor do Score1 parece ser muito grande. Depois de olhar novamente, acontece que existem duas classes = 'Big', e a coleção de tópicos do usuário também pertence a esta classe. Temos que cortar o primeiro elemento através do .Slice (Start, [end]) e modificar a pontuação para pontuar = $ ('. Big'). Slice (0) .Eq (0) .Text (). Trim ();. O resultado correto é mostrado na figura.
{<7>}