عامل الويب: طريقة لتشغيل البرامج النصية في الخلفية في مؤشر ترابط مختلف عن مؤشر الترابط الرئيسي (النافذة) الحالي.
تتعامل JavaScript عادةً مع العمليات غير المتزامنة عن طريق وضع المهام في قوائم الانتظار المقابلة (قائمة انتظار مهام الماكرو، وقائمة انتظار المهام الصغيرة)، مع قيام حلقة الحدث بالتحقق بشكل مستمر من قوائم الانتظار هذه ودفع المهام إلى مكدس الاستدعاءات عندما تكون جاهزة للتنفيذ. يضمن هذا الأسلوب التنفيذ غير المحظور ولكنه لا يزال يشغل كل شيء في سلسلة رسائل واحدة.
من ناحية أخرى، يسمحعمال الويب بتشغيل البرامج النصية في سلسلة رسائل منفصلة تمامًا مع مكدس الاستدعاءات الخاص بها وقوائم الانتظار غير المتزامنة وحلقة الأحداث. يمنع هذا الفصل حظر الخيط الرئيسي بسبب العمليات الحسابية الثقيلة أو المهام طويلة الأمد، حيث يعمل العامل بشكل مستقل.
يقوم عمال الويب بتنفيذ البرامج النصية في سياق مختلف عن سياق النافذة الرئيسية، مما يتيح التوازي في تطبيقات الويب. توفر Web Worker API عدة أنواع من العمال:
تركز هذه المقالة على العاملين المتفانين، وهم الأكثر سهولة في التنفيذ والأكثر استخدامًا.
لإنشاء عامل ويب، يمكنك استخدام الطرق الرئيسية التالية:
لنقم بإنشاء عامل لجلب البيانات من واجهة برمجة التطبيقات (API)، وتحديدًا صور الكلاب من Dog CEO API.
إليك تنفيذ البرنامج النصي العامل. لاحظ أنه داخل العامل، يتم استخدام self للإشارة إلى السياق العام:
if (window.Worker) { const worker = new Worker("/src/worker.js"); worker.postMessage({ operation: "get_dog_imgs", url: "https://dog.ceo/api/breeds/image/random", count: 5 //number of photos }); worker.onmessage = (e) => { console.log(e.data); if (e && e.data) { setdata((old) => [...old, e.data]); // update react state showCallStack(); // function to show the callstack } }; worker.onerror = (e) => { console.log(e); }; }
في هذا الرمز، يستمع العامل للرسائل (onmessage) ويجلب البيانات من عنوان URL المحدد عدة مرات كما هو محدد بواسطة العدد.
إليك ما يبدو عليه مكدس الاستدعاءات داخل العامل:
يستخدم الخيط الرئيسي العامل مثل هذا:
self.onmessage = (event) => { const data = event.data; if (data && data.url && data.count) { fetchFromUrls(data.url, data.count); } } // fetch single data const fetchdata = async (url) => { const res = await self.fetch(url); return await res.json(); }; const fetchFromUrls = async (url, count) => { showCallStack(); // showing the callstack of the worker for (const i of new Array(count).fill(0)) { let data = await fetchdata(url); if (data && data.message) { self.postMessage({ type: "img", data: data.message }); } } };
يوضح هذا الكود كيفية إرسال رسالة إلى العامل واستلام البيانات التي تم جلبها في الموضوع الرئيسي.
للحصول على الكود الكامل اذهب إلى الكود
بينما يعمل عمال الويب في سلسلة رسائل منفصلة عن سلسلة رسائل النافذة الرئيسية، إلا أنهم يأتون مع قيود معينة:
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3