หนังสือเล่มนี้ยังคงดำเนินต่อไปเป็นครั้งสุดท้ายเราจำเป็นต้องปรับเปลี่ยนโปรแกรมเพื่อรวบรวมข้อมูลเนื้อหา 40 หน้าติดต่อกัน กล่าวคือเราต้องส่งออกชื่อลิงค์ความคิดเห็นแรกความคิดเห็นผู้ใช้ความคิดเห็นและจุดฟอรัมของแต่ละบทความ
ดังที่แสดงในรูปค่าที่ได้ $('.reply_author').eq(0).text().trim(); เป็นผู้ใช้ความคิดเห็นแรกที่ถูกต้อง
{<1>}
หลังจากได้รับความคิดเห็นและเนื้อหาชื่อผู้ใช้ใน EventProxy เราต้องข้ามไปยังส่วนต่อประสานผู้ใช้ผ่านชื่อผู้ใช้เพื่อรวบรวมคะแนนผู้ใช้ต่อไป
การคัดลอกรหัสมีดังนี้:
var $ = cheeseio.load (topichtml);
// URL นี้เป็นขั้นตอนต่อไปในการรวบรวมข้อมูล URL เป้าหมาย
var userhref = 'https://cnodejs.org' + $ ('. Reply_author'). eq (0) .attr ('href');
userhref = url.resolve (turl, userhref);
var title = $ ('. topic_full_title'). text (). trim (). แทนที่ (// n/g, "") ;;
var href = topicurl;
var comment1 = $ ('. Reply_content'). eq (0) .Text (). trim ();
var Author1 = $ ('. Reply_author'). eq (0) .Text (). trim ();
// ส่งพารามิเตอร์ไปยังการรวบรวมข้อมูลพร้อมกันครั้งต่อไป
EP.EMIT ('user_html', [userhref, ชื่อ, href, ความคิดเห็น 1, ผู้แต่ง 1]);
ใน EventProxy ในครั้งนี้เราต้องการค้นหาตำแหน่งที่วางคะแนน (class = "big")
{<2>}
เพียงแค่ค้นหาชื่อคลาสมาลองส่งออกผลลัพธ์ก่อน
การคัดลอกรหัสมีดังนี้:
VAR ผลลัพธ์ = superagent.get (userUrl)
.end (ฟังก์ชั่น (err, res) {
ถ้า (err) {
return console.error (err);
-
var $ = cheeseio.load (res.text);
คะแนน var = $ ('. 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 () ไม่ผ่านค่าส่งคืนไปยังวัตถุคำขอและจำเป็นต้องส่งคืนผลลัพธ์ไปยังเลเยอร์ก่อนหน้า (ผู้ใช้)
การคัดลอกรหัสมีดังนี้:
// find userdetails
ep.after ('user_html', topicurls.length, function (ผู้ใช้) {
users = users.map (ฟังก์ชั่น (ผู้ใช้) {
var userUrl = ผู้ใช้ [0];
คะแนน var;
superagent.get (userurl)
.end (ฟังก์ชั่น (err, res) {
ถ้า (err) {
return console.error (err);
-
//console.log(res.text);
var $ = cheeseio.load (res.text);
คะแนน = $ ('. ใหญ่'). text (). trim ();
-
กลับ ({
ชื่อเรื่อง: ผู้ใช้ [1],
Href: ผู้ใช้ [2],
ความคิดเห็น 1: ผู้ใช้ [3],
ผู้แต่ง 1: ผู้ใช้ [4],
คะแนน 1: คะแนน
-
-
ผู้ใช้ส่งออกได้ดีและพบว่านอกเหนือจากคะแนน 1 เป็นค่าที่ถูกต้อง หลังจากการดีบักอย่างระมัดระวังฉันพบว่าโปรแกรมดำเนินการครั้งแรก console.log () จากนั้นดำเนินการ. map () แม่นยำยิ่งขึ้นภายในฟังก์ชั่น. map () ฟังก์ชัน. get () การเรียกกลับไม่ได้เสร็จสิ้นคะแนนการมอบหมายและค่าคืนกลับจะดำเนินการ นี่คือฟังก์ชั่นการโทรกลับแบบอะซิงโครนัสและการดำเนินการแบบซิงโครนัสด้านนอกจะไม่รอให้ฟังก์ชั่นการเรียกกลับเพื่อดำเนินการให้เสร็จสมบูรณ์
{<4>}
วิธีการของฉันคือการปล่อยข้อความอีกชั้นหนึ่งและส่งผ่านข้อมูลที่ต้องการไปยังการดำเนินการข้อความที่ได้รับพร้อมกับข้อความ หลังจาก () เฉพาะเมื่อได้รับข้อความทั้งหมดจะถูกพิมพ์ออกมาพารามิเตอร์ที่ผ่าน (ผลลัพธ์)
การคัดลอกรหัสมีดังนี้:
คะแนน = $ ('. big') ข้อความ (). trim ();
// เพิ่มใหม่
Ep.emit ('got_score', [ผู้ใช้ [1], ผู้ใช้ [2], ผู้ใช้ [3], ผู้ใช้ [4], คะแนน]);
-
ep.after ('got_score', 10, ฟังก์ชั่น (ผู้ใช้) {
console.log (ผู้ใช้);
-
{<6>}
ปัญหานี้ได้รับการแก้ไขแล้ว แต่ค่าของคะแนน 1 ดูเหมือนจะใหญ่เกินไป หลังจากดูอีกครั้งปรากฎว่ามีสองคลาส = 'ใหญ่' และคอลเลกชันหัวข้อของผู้ใช้ก็เป็นของคลาสนี้ เราต้องตัดองค์ประกอบแรกผ่าน. slice ของ Cheerio (เริ่มต้น, [end]) และแก้ไขคะแนนให้คะแนน = $ ('. ใหญ่'). slice (0) .eq (0) .Text (). trim (); ผลลัพธ์ที่ถูกต้องจะแสดงในรูป
{<7>}