การตอบกลับแบบสตรีมจาก fetch
ประมวลผลการตอบกลับขนาดใหญ่ขณะข้อมูลทยอยมาถึง
การตอบกลับแบบสตรีมจาก fetch เป็นบทเรียน JavaScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน JavaScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
คำตอบคือสตรีม
fetch Response จะแสดงเนื้อหาของคำตอบเป็น ReadableStream ผ่าน response.body แทนที่จะรอ payload ทั้งหมด คุณสามารถประมวลผลไบต์ที่มาถึงได้ทันที
const res = await fetch("/big-file");
const stream = res.body; // ReadableStream of Uint8Arrayการอ่านสตรีมเนื้อหา
response.body จะให้ส่วนข้อมูล Uint8Array รับ reader แล้ววนรอยเช่นเดียวกับสตรีมแบบอ่านได้ทุกชนิด
const reader = res.body.getReader();
while (true) {
const { value, done } = await reader.read();
if (done) break;
console.log("received", value.length, "bytes");
}การติดตามความคืบหน้าการดาวน์โหลด
ใช้ส่วนหัวความยาวเนื้อหาร่วมกับจำนวนไบต์ที่ได้รับ เพื่อแสดงแถบความคืบหน้า
const total = +res.headers.get("Content-Length");
let loaded = 0;
while (true) {
const { value, done } = await reader.read();
if (done) break;
loaded += value.length;
console.log(Math.round((loaded / total) * 100) + "%");
}การถอดรหัสไบต์เป็นข้อความ
ใช้ TextDecoder เพื่อเปลี่ยนส่วนข้อมูลไบต์เป็นสตริง ส่ง { stream: true } เพื่อให้ถอดรหัสอักขระหลายไบต์ที่ถูกแบ่งข้ามส่วนข้อมูลได้อย่างถูกต้อง
const decoder = new TextDecoder();
let text = "";
while (true) {
const { value, done } = await reader.read();
if (done) break;
text += decoder.decode(value, { stream: true });
}การใช้ TextDecoderStream
วิธีที่ง่ายกว่าคือส่งสตรีมไบต์ผ่าน TextDecoderStream เพื่อให้ได้สตรีมของสตริงโดยตรง
const textStream = res.body.pipeThrough(new TextDecoderStream());
for await (const chunk of textStream) {
console.log(chunk);
}การแยกวิเคราะห์ NDJSON
JSON ที่คั่นด้วยการขึ้นบรรทัดใหม่จะสตรีมอ็อบเจ็กต์หนึ่งรายการต่อบรรทัด เก็บข้อความไว้ใน buffer แล้วส่งออกบรรทัดที่สมบูรณ์เมื่อสร้างเสร็จ
let buffer = "";
for await (const chunk of textStream) {
buffer += chunk;
let nl;
while ((nl = buffer.indexOf("\n")) >= 0) {
const line = buffer.slice(0, nl);
buffer = buffer.slice(nl + 1);
if (line) console.log(JSON.parse(line));
}
}โทเค็น LLM แบบสตรีม
รูปแบบนี้ขับเคลื่อนการสนทนากับปัญญาประดิษฐ์แบบสตรีม โดยแต่ละส่วนข้อมูลเป็นโทเค็นหรือเหตุการณ์ ซึ่งจะแสดงผลทันทีที่มาถึงเพื่อสร้างเอฟเฟกต์การพิมพ์แบบสด
การยกเลิกสตรีมจากการเรียกข้อมูล
ส่ง AbortSignal ไปยัง fetch แล้วเรียก controller.abort() เพื่อหยุด stream ที่ใช้เวลานานอย่างเรียบร้อย
const controller = new AbortController();
fetch("/stream", { signal: controller.signal });
// later:
controller.abort();การจัดการข้อผิดพลาดของสตรีม
ความล้มเหลวของเครือข่ายระหว่างการสตรีมจะทำให้พรอมิสของ read() ถูกปฏิเสธ ห่อวงรอบไว้ในบล็อกลองและดักจับข้อผิดพลาด เพื่อจัดการการหยุดชะงัก
try {
while (true) {
const { value, done } = await reader.read();
if (done) break;
}
} catch (err) {
console.log("stream interrupted", err);
}เมื่อใดไม่ควรใช้สตรีม
สำหรับคำตอบขนาดเล็ก res.json() หรือ res.text() จะเรียบง่ายกว่า ให้เลือกใช้สตรีมเมื่อ payload มีขนาดใหญ่ ทยอยมาเรื่อย ๆ หรือไม่มีขอบเขตแน่นอน
เนื้อหาคำตอบใช้ได้เพียงครั้งเดียว
คุณอ่าน response.body ได้เพียงครั้งเดียว เรียก res.clone() ก่อนอ่าน หากต้องใช้ซ้ำสองครั้ง เช่น เพื่อการแคช
const copy = res.clone();
await res.body.getReader().read();
// copy still readableตรวจสอบสั้น ๆ
ทดสอบการสตรีมจากการเรียกข้อมูล
สรุป: การเรียกข้อมูลแบบสตรีม
คุณอ่าน response.body ทีละส่วน ติดตามความคืบหน้า ถอดรหัสไบต์ด้วย TextDecoder/TextDecoderStream แยกวิเคราะห์ NDJSON ยกเลิกด้วย AbortController และจัดการข้อผิดพลาด ขั้นต่อไปคือสตรีมแปลงข้อมูล
คำถามที่พบบ่อย
บทเรียน “การตอบกลับแบบสตรีมจาก fetch” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การตอบกลับแบบสตรีมจาก fetch” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส JavaScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การตอบกลับแบบสตรีมจาก fetch”
ประมวลผลการตอบกลับขนาดใหญ่ขณะข้อมูลทยอยมาถึง คุณปฏิบัติ JavaScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน JavaScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน JavaScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การตอบกลับแบบสตรีมจาก fetch” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน JavaScript Academy นี้ได้ไหม
ได้ บทเรียน JavaScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สตรีมที่อ่านได้
- การตอบกลับแบบสตรีมจาก fetch
- สตรีมแปลงข้อมูล
- แรงดันย้อนกลับและการส่งต่อสตรีม