يوفر عامل الويب المخصص (عامل ويب مخصص) طريقة بسيطة للسماح لمحتوى الويب بتشغيل البرنامج النصي في الخلفية. بمجرد إنشاء العامل ، يمكنه نقل الرسالة إلى وظيفة مراقبة الحدث المحددة من قبل منشئه ، بحيث ستتلقى جميع المهام التي تم إنشاؤها بواسطة العامل هذه الرسائل. يمكن لخيط العامل أداء المهام دون واجهة المستخدم التداخل. بالإضافة إلى ذلك ، يمكنه أيضًا استخدام XMLHTTPrequest (على الرغم من أن قيمتي السمة من ResponseXML والقناة هي دائمًا خالية) لأداء عمليات الإدخال/الإخراج. توفر هذه المقالة أمثلة وتفاصيل لتعويض المستندات السابقة. الوظيفة المقدمة للعامل تسرد الوظائف التي يدعمها العامل.
ستقوم واجهة العامل بإنشاء سلسلة تشغيل حقيقية. ومع ذلك ، بالنسبة لعامل الويب ، سيتم التحكم في نقاط الاتصال مع مؤشرات الترابط الأخرى بعناية ، مما يعني أنه من الصعب عليك التسبب في تعقيد. ليس لديك وسيلة للوصول إلى مكونات أمان غير مشوهة أو DOMS. لذلك إذا لم تقضي بعض الجهد ، فلن تتمكن من ارتكاب أخطاء. توليد عامل
من السهل جدًا إنشاء عامل جديد. كل ما عليك فعله هو استدعاء مُنشئ العامل () ، وتحديد URI الذي يحتاج إلى تشغيل برنامج نصي يعمل في سلسلة العمال. وظيفة معالجة الأحداث المحددة.
var myworker = New Worker (my_task.js) ؛
أو يمكنك أيضًا استخدام AddEventListener ():
var myworker = my_task.js) ؛ العامل.
السطر الأول في المثال ينشئ موضوع عمل جديد. يضع القانون الثالث وظيفة المراقبة لحدث الرسالة. عندما يستدعي العامل وظيفة postmessage () الخاصة به ، يتم استدعاء وظيفة معالجة الحدث هذه. أخيرًا ، تم إطلاق موضوع العمال في السطر السابع. ملاحظة: يجب أن تتبع المعلمة URI التي تنقل مُنشئ العمال الاستراتيجية المتماثلة. في الوقت الحاضر ، لا يزال مصنعو المتصفح مختلفًا مختلفًا عن URIs يجب أن يتبع الاستراتيجيات المتماثلة ؛ Blob Uri.
تمرير البياناتيتم نسخ البيانات التي يتم نقلها بين الصفحة الرئيسية والعامل ، ولم يتم مشاركتها. يحتاج الكائن الذي تم تمريره إلى العامل إلى التسلسل ، ثم يجب التسلسل الطرف التالي. لا تشارك الصفحة نفس المثال مثل العامل. تستخدم معظم المتصفحات نسخة منظمة لتحقيق هذه الميزة.
قبل النزول ، لغرض التدريس ، دعنا ننشئ دالة تسمى SeletingMessage ().
الوظيفة المحاكاة (VVAL) {return eval ؛ Boolean // Test #3V #3V Arment 3 = Hello World) ؛ ، العمر: 43} ؛ example5 = حيوان جديد ، 3) ؛القيمة غير المشتركة تسمى الرسالة. دعنا نتحدث عن العامل ، يمكنك استخدام postmessage () لتمرير الرسالة إلى الموضوع الرئيسي أو إرسالها مرة أخرى من الموضوع الرئيسي. تحتوي سمة البيانات لحدث الرسالة على بيانات من العامل.
example.html: (الصفحة الرئيسية):var myworker = my_task.js) ؛ ؛
ملاحظة: بشكل عام ، موضوعات الخلفية -لا تتوافق مع العامل -غير قادر على تشغيل DOM. إذا احتاج مؤشر ترابط الخلفية إلى تعديل DOM ، فيجب عليه إرسال الرسالة إلى مؤسسه بحيث يقوم المبدع بإكمال هذه العمليات.
كما ترون ، فإن الرسالة المرسلة بين العامل والصفحة الرئيسية هي دائمًا "رسالة JSON" ، حتى لو كانت نوعًا أصليًا من القيمة. لذلك ، يمكنك نقل بيانات JSON و/أو أي نوع بيانات يمكن أن يتسلسل:
postmessage ({cmd: init ، timestamp: date.now ()}) ؛أمثلة لتمرير البيانات
مثال رقم 1: إنشاء "alues alues () غير متزامن شائع"
يقدم المثال التالي كيفية استخدام eval () في العامل لتنفيذ أي نوع من رمز JavaScript في أي نوع من أنواع غير متزامنة بالترتيب ::
// Syntax: Asynceval (Code [، stistner]) var asynceval = (function () {var alistener = [] ٪ 20 ٪ 28oevent ٪ 29 ٪ 20 ٪ 7b ٪ 0a ٪ 09postmessage ٪ 28 ٪ 7b ٪ 09 ٪ 09 ٪ 22id 22 ٪ 20oevent.data ٪ 2C ٪ 09 ٪ 22evaluent ٪ 22 ٪ 3A 3A 3A 3A 3A 3A 3A 3A 3A ٪ 20eval ٪ 28oevent.data.Code ٪ 29 ٪ 0a ٪ 09 ٪ 7d 29 ٪ 3B ٪ 0a ٪ 7d) ؛ data.id] (eevent.data.evalated) ؛} حذف Alisteners [eevent.data.id] ؛ : Alisteners.Length -1 ، الكود: Scode}) ؛} ؛}) ؛مثال الاستخدام:
// رسالة تنبيه غير متزامنة ... Asynceval (3 + 2 ، وظيفة (smessage) {Alert (3 + 2 = + smessage) ؛ // طباعة غير متزامنة ... Asynceval (// Hello World !!! (shtml) {document.body.appendchild (document.createTextNode (shtml) ؛}) ؛ .Open (/get/، /http://www.mozilla.org/ ، false) ؛/n/toreq.send (null) ؛/n/treturn oreq.responsetext ؛/n}) ؛) ؛)) ؛)) ؛)) ؛)) ؛)) ؛)) ؛)) ؛)) ؛) ؛) ؛) ؛) ؛) ؛)) ؛) ؛) ؛) ؛)) ؛) ؛)) ؛) ؛) ؛) ؛)) ؛) ؛مثال رقم 2: نقل الطريقة المتقدمة لـ JSON وإنشاء نظام تبادل
إذا كنت بحاجة إلى نقل بيانات معقدة للغاية ، وتحتاج إلى استدعاء طرق متعددة على الصفحة الرئيسية والعامل في نفس الوقت ، فيمكنك التفكير في إنشاء نظام مشابه لما يلي.
example.html (الصفحة الرئيسية): <! الوسيطة لتمرير 1 ، وسيطة لتمرير 2 ، إلخ): استدعاء وظيفة العامل القابلة للاستعلام * postMessage (سلسلة أو بيانات JSON): انظر العامل. وظيفة): يضيف مستمع * removelistener (الاسم): يزيل مستمع Queeryker مثيلات الخصائص: * defaultListerender: The Default Beasoner Executem فقط عندما يتصل العامل بوظيفة postmessage () مباشرة */ وظيفة QueryableWorker (surl ، fdeflistener ، fonerror) {var Oinstance = هذا ، Oworcer = عامل جديد (Surl) .data.hasownproperty (rnb93qh) {olisteners [eevent.data.vo42t30]. {owster.onerror = fonerror ؛} this.sendquery = function (/ * اسم وظيفة Queryable ، وسيطة لتمرير 1 ، وسيطة لتمرير 2 ، 2 ، 2 ، إلخ */) {if (enduments.length <1) { رمي Typerror الجديد (QueryableWorker.Sendquery -لا توجد حجج كافية) ؛ = وظيفة (vmsg) {// أعتقد أنه لا توجد حاجة لاستخدام Call () ماذا عن فقط من (vmsg) ؛ Prototy Worker.Protype.PostMessage.Call (Oworker ، VMSG) ؛ ] = flistener ؛} ؛ ] * /) ؛ ) ؛ A ID = FirstLink Href = JavaScript: OmyTask.SendQuery ('getDifferente' ، 5 ، 3) ؛> ما هو الفرق بين 5 و 3؟ OmyTask.sendquery ('waitsomething') ؛ ) {// افعل شيئًا} funct} funct ion myPrivinFunc2 () {// افعل شيئًا} // إلخ. احصل على اختلاف الرهان ween اثنين من nightrs: getDifference: function (nminund ، nsubtrahend) {الرد (printsomething ، nminuend -nsubtrahend) ؛} ، // مثال #2: انتظر ثلاث ثوان waitsomething: function () tsomething ، 3 ، الجنس) ؛} ، 3000) ؛}} ؛ (/ * اسم المستمع ، وسيطة لتمرير 1 ، والوسيطة لتمرير 2 ، إلخ : الوسيطات [0] ، rnb93qh: array.prototype.slice .call (وسيطات ، 1)}) ؛ {queryablefunction [eevent.data .bk4e1h0] .apply (self ، oevent.data.ktp3fm1) ؛} ell {defaultQuery (eevent.data) ؛}} ؛هذه طريقة مناسبة للغاية لتبديل الأخبار بين الصفحة الرئيسية-العامل-أو العكس-عكس ذلك.
نقل البيانات عن طريق نقل الملكية (كائن قابل للتحويل)
يتضمن Google Chrome 17 و Firefox 18 طريقة أخرى ذات أداء أعلى لتمرير نوع محدد من الكائن (كائن قابل للتحويل) إلى عامل/عودة من العامل. يتم نقل كائن النقل من سياق إلى سياق آخر دون أي عملية نسخ. هذا يعني أنه سيحصل على تحسن كبير في الأداء عند تمرير البيانات الضخمة. إذا أتيت من عالم C/C ++ ، تخيل ذلك كإرسال وفقًا للإشارة. ومع ذلك ، على عكس النقل وفقًا للمرجع ، بمجرد نقل الكائن ، فإن الإصدار الذي لن يوجد السياق الأصلي. يتم نقل ملكية الكائن إلى السياق الجديد. على سبيل المثال ، عند نقل كائن ArrayBuffer من التطبيق الرئيسي إلى العامل ، يتم مسح ArrayBuffer الأصلي ولا يمكن استخدامه. سيتم تمرير المحتوى الذي يحتوي عليه (كاملة) إلى سياق العامل.
// إنشاء ملف 32 ميجابايت وملءه. ؛توليد عامل فرعي
إذا لزم الأمر ، يمكن للعمال توليد المزيد من العمال. وهذا ما يسمى العامل الفرعي ، الذي يجب أن يستضيف في نفس مصدر الصفحة الأصل. بنفس الطريقة ، يحلل العامل الفرعي عنوان URI بدلاً من صفحته الخاصة بدلاً من صفحته الخاصة. هذا يجعل العامل يراقب اعتماده بسهولة. Chrome لا يدعم العوامل الفرعية.
عامل مضمنلا توجد حاليًا طريقة "رسمية" يمكنها تضمين رمز العامل في صفحة ويب مثل عناصر <script>. ولكن إذا لم يكن عنصر <script> لا يحتوي على خصائص SRC ، ولم يتم تحديد خصائص نوعه كنوع من نوع MIME ، فسيتم اعتباره عنصر كتلة بيانات ويمكن استخدامه بواسطة JavaScript. "كتلة البيانات" هي ميزة شائعة جدًا في HTML5 ، والتي يمكن أن تحمل أي نوع من بيانات نوع النص تقريبًا. لذلك ، يمكنك تضمين عامل بالطريقة التالية:
<! . var myvar = Hello World! ؛ </script> <script type = text/javaScript> // سيتم تحليل البرنامج النصي بواسطة محرك JS لأن نوع MIME هو Text/JavaScript. وظيفة pagelog (smsg) {// استخدم جزء: وبهذه الطريقة ، سيقوم المتصفح فقط بتقديم/إعادة. var ofragm = document.createdocumentfragment () ؛ -Workr> // لن يتم تحليل هذا البرنامج النصي بواسطة محرك JS لأن نوع MIME هو Text/JS-Door. onMessage = وظيفة (oevent) {postmessage (myvar) ؛} ؛ </script> <script type = text/javaScript> // سيتم تحليل البرنامج النصي بواسطة محرك JS لأن نوع MIME هو Text/JavaScript. // في الماضي ...: // نستخدم blob builder // ... ولكن الآن نستخدم blob ...: var blob = new Blob (array.prototype.map.call (documens.quelyselectorary (script [type [type [type =/text // js- workr/] ، function (oscript) {return oscript.textContent ؛}) ، {type: text/javaScript}) ؛ سيناريو العامل. document.worker = window.url.createBjecturl (blob)) ؛ () {document.worker.postmessage () ؛} ؛الآن ، تم تعيين العامل المدمج في وثيقة مخصصة.
المهلة والفاصل الزمنييمكن للعامل استخدام المهلة والفاصل الزمني مثل الخيط الرئيسي. سيكون هذا مفيدًا للغاية ، على سبيل المثال ، إذا كنت تريد أن يقوم مؤشر ترابط العمال بشكل دوري دون انقطاع رمز التشغيل دون انقطاع.
عامل الإنهاءإذا كنت ترغب في إنهاء عامل على الفور ، فيمكنك استدعاء طريقة العامل () ::
myworker.layer () ؛
سيتم قتل خيط العمال على الفور ولن يترك أي فرصة للسماح له بإكمال عمله أو تنظيفه.
يمكن للعمال أيضًا استدعاء طريقة nsiworkerscope.close () لإغلاق نفسك:
self.close () ؛أخطاء العملية
عندما يكون العامل هو أخطاء في وقت التشغيل ، يتم استدعاء وظيفة معالجة الأحداث في Onerror. يتلقى حدثًا ينفذ خطأ اسم واجهة Errorevent. لن يتم إلغاء الحادث ويمكن إلغاؤه ؛ يحتوي حدث الخطأ على الحقول الثلاثة التالية المهتمة بـ:
رسالةرسائل خطأ قابلة للقراءة.
اسم الملفاسم ملف نصي الخطأ.
الكتانرقم سطر ملف البرنامج النصي عند حدوث خطأ.
قم بزيارة كائن Navigatorيمكن للعمال الوصول إلى كائنات الملاح في نطاقها. أنه يحتوي على السلسلة التالية التي يمكن أن تتعرف على المتصفح ، كما يفعل ذلك في البرامج النصية العادية:
يمكن لخيط العامل الوصول إلى وظيفة عالمية ، و importscripts () ، والتي تتيح للعامل تقديم البرنامج النصي أو المكتبة في نطاقه الخاصة. يمكنك تقديم URI دون تمرير المعلمات ، أو إلى URI من البرامج النصية المتعددة ؛
eStrosscripts () */
يحمل المتصفح ويدير البرنامج النصي. يمكن استخدام الكائنات العالمية في كل نص من قبل العامل. إذا تعذر تحميل البرنامج النصي ، فسيتم طرح استثناء Network_error ، ولن يتم تنفيذ الكود التالي. لا يزال من الممكن استخدام الرمز الذي تم تنفيذه مسبقًا (بما في ذلك الكود الذي تم تنفيذه باستخدام Window.SetTimeOut ()). لا يزال من الممكن استخدام إعلان الوظيفة بعد الاستيراد () لأنها تعمل دائمًا قبل رمز آخر. ملاحظة: لا يتم إصلاح ترتيب تنزيل البرنامج النصي ، ولكن سيتم تمرير الطلب إلى المستورد () () عند تنفيذها. يتم الانتهاء من ذلك في وقت واحد ؛
مثاليوفر هذا القسم عدة أمثلة على كيفية استخدام DOM Worker.
تنفيذ العمليات في الخلفية
واحدة من مزايا العامل هي أنه يمكن تنفيذ التشغيل الكثيف للمعالج دون منع سلسلة واجهة المستخدم. في المثال التالي ، يتم استخدام العامل لحساب Fibona.
رمز JavaScript
يتم تخزين رمز JavaScript التالي في ملف "Fibonacci.js" ، والذي يرتبط بملف HTML في القسم التالي.
نتائج var = [] ؛ دالة errorreceiver (الحدث) {throw event.data ؛} onMessage = function (event) {var n = parseint (event.data) ؛ } لـ (var i = 1 ؛ i <= 2 ؛ i ++)يقوم العامل بتعيين السمة onMessage على وظيفة. (لاحظ أن هذا الاستخدام ليس هو نفسه تحديد متغير عالمي بنفس الاسم ، أو وظيفة تحمل نفس الاسم. سيحدد Var onMessage و Function OnMessage نفس السمات العالمية مثل الاسم ، لكنهم لن يسجلوا وظيفة الرسالة المرسلة بواسطة صفحة الويب.) سيمكن هذا العودة وإنشاء نسختك الجديدة لمعالجة كل دورة من الحساب.
رمز HTML
<! = عامل جديد (Fibonacci.js) ؛ = خطأ) {خطأ في العامل: + خطأ +/ن) ؛تقوم صفحة الويب بإنشاء عنصر div ، ويكون المعرف نتيجة ، يستخدمه لعرض نتيجة الحساب ، ثم إنشاء عامل. بعد إنشاء عامل ، يتم تكوين وظيفة معالجة OnMessage لعرض نتائج الحساب عن طريق تعيين محتوى عنصر DIV ، ثم يتم تعيين وظيفة معالجة ONERROR على معلومات خطأ التخزين. أخيرًا ، أرسل رسالة إلى العامل لبدءها.