0Pricing
JavaScript Academy · บทเรียน

การตอบกลับแบบสตรีมจาก 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สตรีมที่อ่านได้
  2. การตอบกลับแบบสตรีมจาก fetch
  3. สตรีมแปลงข้อมูล
  4. แรงดันย้อนกลับและการส่งต่อสตรีม
← กลับไปที่ JavaScript Academy