Das Buch wird letztes Mal fortgesetzt. Wir müssen das Programm ändern, um den Inhalt von 40 Seiten hintereinander zu kriechen. Das heißt, wir müssen den Titel, den Link, den ersten Kommentar, den Kommentarbenutzer und die Forumpunkte jedes Artikels ausgeben.
Wie in der Abbildung gezeigt, wird der $('.reply_author').eq(0).text().trim(); ist der richtige erste Kommentarbenutzer.
{<1>}
Nachdem wir Kommentare und Benutzernameninhalte in EventProxy erhalten haben, müssen wir über den Benutzernamen zur Benutzeroberfläche springen, um weiterhin die Benutzerpunkte zu kriechen
Die Codekopie lautet wie folgt:
var $ = Cheeseio.load (topichtml);
// Diese URL ist der nächste Schritt, um die Ziel -URL zu kriechen
var userhref = 'https://cnodejs.org' + $ ('. Reply_author'). EQ (0) .Attr ('href');
userhref = url.resolve (Turl, userHref);
var title = $ ('. topic_full_title'). text (). trim (). Ersetzen (// n/g, "") ;;
var href = topicurl;
var comment1 = $ ('. Reply_Content'). EQ (0) .Text (). Trim ();
var Author1 = $ ('. Reply_author'). EQ (0) .Text (). trim ();
// Übergeben Sie die Parameter an das nächste gleichzeitige Crawl
ep.emit ('user_html', [userhref, title, href, comment1, author1]);
In EventProxy wollen wir diesmal herausfinden, wo die Punktzahl platziert wird (class = "big").
{<2>}
Finden Sie einfach den Klassennamen, versuchen wir zuerst, das Ergebnis auszugeben
Die Codekopie lautet wie folgt:
var outcome = superagent.get (userurl)
.end (Funktion (err, res) {
if (err) {
return console.Error (err);
}
var $ = Cheeseio.load (res.text);
var Score = $ ('. Big'). text (). trim ();
console.log (Benutzer [1]);
console.log (Benutzer [2]);
console.log (Benutzer [3]);
console.log (Benutzer [4]);
console.log ($ ('. big'). text (). trim ());
zurückkehren ({
Titel: Benutzer [1],
HREF: Benutzer [2],
Kommentar1: Benutzer [3],
Author1: Benutzer [4],
Score1: Punktzahl
});
});
});
Führen Sie das Programm aus und das Ergebnis wird durch diesen Code erhalten.
{<3>}
Das Problem ist jedoch, dass wir das Ergebnis in der Rückruffunktion von .end () korrekt ausgeben können, aber wir können das Ergebnis nicht korrekt ausgeben. Wenn Sie genau hinschauen, ist die Ausgabe, die ausgegeben werden muss, ein Anforderungsobjekt. Dies liegt an unachtsamen Fehlern. Die Funktion .end () übergibt den Rückgabewert nicht an das Anforderungsobjekt und muss das Ergebnis an die vorherige Ebene (Benutzer) zurückgeben.
Die Codekopie lautet wie folgt:
// Benutzerdetails finden
ep.after ('user_html', topicurls.length, Funktion (Benutzer) {
user = user.map (Funktion (Benutzer) {
var userurl = user [0];
Var -Score;
superagent.get (userurl)
.end (Funktion (err, res) {
if (err) {
return console.Error (err);
}
//console.log(res.text);
var $ = Cheeseio.load (res.text);
Score = $ ('. Big'). text (). trim ();
});
zurückkehren ({
Titel: Benutzer [1],
HREF: Benutzer [2],
Kommentar1: Benutzer [3],
Author1: Benutzer [4],
Score1: Punktzahl
});
});
Benutzer gut exportieren und feststellen, dass andere als Score1 die richtigen Werte sind. Nach sorgfältigem Debuggen stellte ich fest, dass das Programm zuerst Console.log () und dann .MAP () durchgeführt habe. Genauer gesagt, innerhalb der Funktion .Map () wird die Rückruffunktion .get () die Zuordnungsbewertung nicht ausgeschlossen und der Rückgabewert wird durchgeführt. Dies ist die asynchrone Rückruffunktion, und der äußere synchrone Vorgang wartet nicht, bis die Rückruffunktion die Operation abgeschlossen hat.
{<4>}
Mein Ansatz ist es, eine andere Nachrichtenebene auszugeben und die erforderlichen Daten zusammen mit der Nachricht an den Empfangsnachrichtenvorgang zu übergeben. Nach () werden nur dann, wenn alle Nachrichten empfangen werden, die übergebenen Parameter (Ergebnis) aus.
Die Codekopie lautet wie folgt:
Score = $ ('. Big') text (). trim ();
// neu hinzugefügt
ep.emit ('got_score', [Benutzer [1], Benutzer [2], Benutzer [3], Benutzer [4], Score]);
.....
ep.after ('got_score', 10, function (user) {
console.log (Benutzer);
});
{<6>}
Dieses Problem wurde gelöst, aber der Wert von Score1 scheint zu groß zu sein. Nachdem es erneut nachgesehen hat, stellt sich heraus, dass es zwei Klasse = 'Big' gibt und die Themensammlung des Benutzers auch zu dieser Klasse gehört. Wir müssen das erste Element durch Cheerios .Slice (Start, [Ende]) schneiden und die Punktzahl auf Score = $ ('. Big'). Das korrekte Ergebnis ist in der Abbildung dargestellt.
{<7>}