0Pricing
JavaScript Academy · درس

استجابات fetch المتدفقة

عالجوا الاستجابات الكبيرة أثناء وصولها.

استجابات fetch المتدفقة درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

الاستجابات عبارة عن تدفقات

توفّر Response الناتجة عن fetch جسمها كتدفق ReadableStream عبر response.body. وبدلًا من انتظار الحمولة الكاملة، يمكنك معالجة البايتات عند وصولها.

const res = await fetch("/big-file");
const stream = res.body; // ReadableStream of Uint8Array

قراءة تدفق الجسم

تنتج response.body أجزاءً من النوع Uint8Array. احصل على قارئ وكرّر القراءة كما تفعل مع أي تدفق قابل للقراءة.

const reader = res.body.getReader();
while (true) {
  const { value, done } = await reader.read();
  if (done) break;
  console.log("received", value.length, "bytes");
}

تتبّع تقدم التنزيل

اجمع بين ترويسة Content-Length وعدد البايتات المستلمة لعرض شريط تقدم.

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 المحدد بفواصل أسطر كائنًا واحدًا في كل سطر. خزّن النص مؤقتًا وأصدر الأسطر المكتملة عند تكوّنها.

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

يمكّن هذا النمط من تشغيل محادثات الذكاء الاصطناعي المتدفقة: إذ يكون كل جزء رمزًا أو حدثًا، ويُعرض فور وصوله لإظهار تأثير الكتابة المباشرة.

إلغاء تدفق fetch

مرّر AbortSignal إلى fetch واستدعِ controller.abort() لإيقاف تدفق طويل بطريقة سليمة.

const controller = new AbortController();
fetch("/stream", { signal: controller.signal });
// later:
controller.abort();

التعامل مع أخطاء التدفق

تؤدي أعطال الشبكة في منتصف التدفق إلى رفض وعد read(). ضع الحلقة داخل try/catch للتعامل مع الانقطاعات.

try {
  while (true) {
    const { value, done } = await reader.read();
    if (done) break;
  }
} catch (err) {
  console.log("stream interrupted", err);
}

متى لا تستخدم التدفق

بالنسبة إلى الاستجابات الصغيرة، يكون res.json() أو res.text() أبسط. استخدم التدفق عندما تكون الحمولة كبيرة أو تدريجية أو غير محدودة.

جسم الاستجابة للاستخدام مرة واحدة

يمكنك قراءة response.body مرة واحدة فقط. استدعِ res.clone() قبل القراءة إذا احتجت إليه مرتين، مثلًا للتخزين المؤقت.

const copy = res.clone();
await res.body.getReader().read();
// copy still readable

تحقق سريع

اختبر تدفق fetch.

مراجعة: تدفق fetch

قرأت response.body جزءًا بعد جزء، وتتبعت التقدم، وفككت ترميز البايتات باستخدام TextDecoder/TextDecoderStream، وحللت NDJSON، وألغيت التدفق باستخدام AbortController، وتعاملت مع الأخطاء. التالي: تدفقات التحويل.

الأسئلة الشائعة

هل درس «استجابات fetch المتدفقة» مجاني؟

نعم — نص درس «استجابات fetch المتدفقة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «استجابات fetch المتدفقة»؟

عالجوا الاستجابات الكبيرة أثناء وصولها. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟

لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «استجابات fetch المتدفقة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟

نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التدفقات القابلة للقراءة
  2. استجابات fetch المتدفقة
  3. تدفقات التحويل
  4. الضغط العكسي وتمرير التدفقات
← العودة إلى JavaScript Academy