تنفيذ فئة غير متزامن في اياكس

وبعد أن قرر XMLHttpRequests متزامنة هي وسيلة للذهاب ، وغير متزامن التغليف يتم تعريف فئة. طبقة تغليف ليس ضروريا ، ولكنه يجعل من السهل العمل مع كائن XMLHttpRequest. والميزة الرئيسية لاستخدام طبقة تغليف هي جمعية للكائن XMLHttpRequest مع كتلة رمز. وبالنسبة لتجديد المعلومات ، دعونا ننظر إلى رمز لتحميل ذرية تغذية مرة أخرى :

LoadAtomFeed الدالة () (فار تزامني = متزامنة جديدة () ؛ asynchronous.settings = (onComplete : وظيفة (xmlhttp) (parseAtom (xmlhttp.responseXML) ؛ flexbox.update () ؛)) asynchronous.get ( "/ الخدمات / بلوق / مداخل / الحالي ") ؛)
  

لجعل الطبقة العمل غير متزامن ، يحتاج المستخدم إلى القيام بأمرين : المنتسبين الإعدادات عضو البيانات مع بعض المعلومات ، والدعوة الى الأسلوب المناسب (على سبيل المثال ، الحصول على) لإجراء طلب المتشعب. الغرض من إعدادات عضو البيانات هو تقديم رد والمعلومات الاضافية المرتبطة الطلب. على سبيل المثال ، الأسلوب onComplete يسمى مرة واحدة على طلب المتشعب قد اكتملت.

رمز كما هو عليه من السهل أن نفهم ، ولكن تذكر أن رمز غير متزامنة. ونتيجة لذلك ، عندما الأسلوب asynchronous.get يتم استدعاء الدالة LoadAtomFeed سيتم إنهاء قبل استدعاء onComplete وإعادة السيطرة للمستخدم. في أسوأ الأحوال ، إذا كان مستخدم يذهب فوق مجنون ، يمكن أن يكون هناك العشرات من الطلبات المقدمة. والبديل هو استخدام المكالمات متزامن ، والتي قفل المتصفح ، وذلك في حد ذاته ليس خيارا. على الجانب الإيجابي ، والسلوك غير متزامن يسمح للمستخدم لبدء مهام وانتظار النتائج. مبرمج أن نظل متيقظين والتأكد من أن المستخدم لا نسبق عليه أو عليها. الآن أن لديك فهم أساسي لكيفية استخدام الفئة غير متزامن ، دعونا ننظر في التفاصيل لتنفيذ متزامن. الفئة الكشف عن أسلوب لكل الفعل المتشعب ، وعلى سبيل المثال الحصول على الأسلوب يناظر الفعل المتشعب الحصول عليها. تنفيذ الحصول على النحو التالي :

وظيفة HttpRequest_get (strurl) (this.call ((العمل : "الحصول على" ، عنوان : strurl)) ؛)

في تنفيذ HttpRequest_get ، والتي تم تعيينها إلى Asynchronous.get ، في اشارة الى استدعاء الدالة في هذا الصدد. للحصول على وظيفة هو طريقة مريحة لأسلوب الدعوة ، وأسلوب الدعوة يقبل معلمة واحدة : كائن مع أعضاء بيانات محددة. في حالة الحصول على أسلوب العمل وأعضاء البيانات رابط يتم تعريفها. فلماذا خلق كائن ، عندما كان يمكن أن تستخدم معلمتين والعمل ورابط ، لاستدعاء الأسلوب؟ الجواب هو المرونة. جافا سكريبت لا يفهم وظائف زائدة ، ويمكن أن يكون هناك سوى وظيفة واحدة مع مجموعة واحدة من المعلمات. بحيث المطور ليس من الضروري أن تلعب لعبة التباديل وتوليفات مع المعلمات (على سبيل المثال ، والتي المعلمات ، ما هو النظام ، الخ) ، كائن مع أعضاء بيانات تم إنشاؤه.

الأسلوب الأكثر أهمية هو دعوة غير متزامن ، وذلك لأن بغض النظر عن النص المتشعب الذي يتم استخدام الفعل ، وطريقة يتم تنفيذها. البرمجية التالية هي التنفيذ الكامل للدعوة.

 المصدر : 

أنا الآن شرح طريقة دعوة من البداية إلى النهاية ، وأنا أكرر القطع البرمجية الفردية ، مع اختصار بعض التكرار. وتبين لي رمز مرة أخرى عند الاقتضاء لتسهيل التفاهم ، وتنفيذ مكالمة طويلة نسبيا ، ويفعل اشياء كثيرة مختلفة ، ابتداء من أعلى ، على سبيل المثال متغير يتم تعيين قيمة هذا : فار = هذا المثال ؛ هذه الاحالة ضرورية لأن كتلة القانون سيتم تعيينها العضو onreadystatechange البيانات ، وكتلة التعليمات البرمجية التي يجب أن نتذكر مثلا غير متزامن يتم المشار إليها ، وبعد الاحالة ، علينا التحقق من أن إعدادات بيانات عضو لقد تم ملؤها :

إذا (! this.settings) (رمي خطأ جديدا ( "إعدادات لم يتم تعريف") ؛)

ضبط بيانات العضو في الوجود لأنه يحتوي على معلومات حول الأساليب التي لاستدعاء عند الطلب والتي أكملت النص المتشعب رؤوس إضافة إلى الطلب. عند هذه النقطة ، يجب أن لاحظت أن اثنين من الأشياء اللازمة لجعل استدعاء أسلوب العمل. الكائن الأول هو الضبط ، والكائن الثاني هو طلب المعلمة. في اختصار ، يمكن مطور الجمع بين الكائنات اثنين الى واحد ، وإما نقله الى استدعاء أسلوب أو تعيين إلى الإعدادات عضو البيانات. وهذا من شأنه أن يكون الاختصار مضللة ، لأن كل كائن له هدف مختلف.

الكائن طلب يستخدم لتحديد إعدادات معينة عنوان تاريخ تقديم الطلب. إعدادات كائن يستخدم لتحديد الإعدادات التي تتجاوز كل المكالمات ويمكن أن يكون النظر في رد عالمي للمثيل كائن غير متزامن. والفكرة هي أنه يمكنك تخصيص مثيل متزامن ، وتحديد الكيفية التي ينبغي أن تتصرف ، ومن ثم بدء تقديم طلبات مع امكانية الدعوة عناوين مختلفة. ومن ثم فإن الخطوة التالية هي للتحقق من أن الحالية XMLHttpRequest سبيل المثال ليست مشغولة بالفعل :

إذا كان (this.xmlhttp.readyState! = 4 & & this.xmlhttp.readyState! = 0) (رمي خطأ جديدا ( "النشطة حاليا الطلب لا يمكن ان يستمر") ؛)
 

عند استخدام XMLHttpRequest في وضع غير متزامن ، فمن الممكن تقديم طلب جديد المتشعب XMLHttpRequest المنفذة على سبيل المثال. والمشكلة هي أنه لا يمكن أن تخدم XMLHttpRequest طلبين ، وانها ستتوقف عن طلب بالفعل المنفذة لتقديم طلب جديد. الخاصية readyState يستخدم للدلالة على حالة الكائن XMLHttpRequest. إذا readyState هي 0 ، ثم لم الطلب قد قدم طلبا المتشعب والتي يمكن تحقيقها. إذا readyState هو 4 ، ثم الطلب قد قدم ، بناء على طلب أنجزت ، والكائن على استعداد لتقديم طلب آخر. إذا readyState له أي قيمة أخرى ، طلب يجري تنفيذه حاليا ، وبالتالي تنفيذ طلب آخر لا معنى له ، وبعد التدقيق في التهيئة وانتهت ، وأنه من الممكن تقديم طلب : this.xmlhttp.open (request.action ، طلب . رابط ، صحيح ، this.settings.username ، this.settings.password) ؛ استدعاء الأسلوب فتح ، تحتاج إلى تحديد والمتشعب في aminimum الفعل (على سبيل المثال ، والحصول ، من الوظائف) عن طريق request.action عضو البيانات وعنوان الموقع عن طريق وRequest.Url بيانات الأعضاء. كلما قمت بإجراء أي طلب XMLHttpRequest ، تأكد من أن العمل الأول هو الأسلوب فتح. إذا قمت بتعيين وظيفة onreadystatechange قبل الدعوة مفتوحة ، وسوف طلبك لا تعمل بشكل صحيح. إذا حاولت تعيين رؤوس طلب قبل الدعوة مفتوحة ، وسوف طلبك لا تعمل بشكل صحيح. طريقة فتح يستخدم لتهيئة وخلق طلب جديد ؛ فتح لن دعوة خادم ، حيث أن ذلك هو من مسؤولية إرسال.

في المثال فتح الأسلوب ، على اسم المستخدم وكلمة السر (this.settings.username وthis.settings.password ، على التوالي) هي دائما إرسالها إلى الخادم ، وحتى إذا لم يكن هناك اسم المستخدم وكلمة السر. فإنه لا يضر لإرسال قيم فارغة ، وأنها لن تؤثر على عملية طلب المتشعب. اسم المستخدم وكلمة السر هي تستخدم فقط عندما تكون العنوان التالي خادم ينفذ التحدي ويسأل عن اسم المستخدم وكلمة السر. في سياق الكائن XMLHttpRequest ، اسم المستخدم وكلمة السر لا تستخدم إلا في حالة تنفيذ XMLHttpRequest الاحتياجات الأساسية للمعلومات. بعد أن كنت قد فتحت على طلب ، يمكنك إضافة مخصصة المتشعب رؤوس باستخدام الأسلوب setRequestHeaders :

إذا كان (request.headers) (ل(defHeader في request.headers) (this.xmlhttp.setRequestHeader (defHeader ، request.headers [defHeader]) ؛)) إذا كان (this.settings.headers) (ل(defHeader في this.settings . رؤوس) (this.xmlhttp.setRequestHeader (defHeader ، this.settings.headers [defHeader]) ؛))

رؤوس يتم تعيين مرتين : مرة للحصول على إعدادات المقترنة الطلب (request.headers) ومرة واحدة للحصول على الضبط العالمي (this.settings.headers). الرؤوس التي تقوم بتعيينها يمكن أن يكون معيار النص المتشعب رؤوس أو رؤوس مخصصة. إذا كنت تخطط لاستخدام مخصص المتشعب الرؤوس ، هو دائما فكرة جيدة لالبادئة لهم العاشر. وبهذه الطريقة ، سيكون لديك رؤوس لا يمكن الخلط بينه وبين رؤوس المتشعب القياسية. بعد أن كنت قد كلف رؤوس ، وonreadystatechange الدالة رد الاتصال يتم تعيينه :

this.xmlhttp.onreadystatechange = الدالة () (التبديل (instance.xmlhttp.readyState) (القضية 1 : إذا كان (instance.settings.onLoading) (instance.settings.onLoading (instance.xmlhttp) ؛) كسر ؛ القضية 2 : إذا كان ( instance.settings.onLoaded) (instance.settings.onLoaded (instance.xmlhttp) ؛) كسر ؛ القضية 3 : إذا كان (instance.settings.onInteractive) (instance.settings.onInteractive (instance.xmlhttp) ؛) كسر ؛ القضية 4 : إذا كان (instance.settings.onComplete) ((محاولة instance.settings.onComplete (instance.xmlhttp) ؛) الصيد (ه) (globals.errorHandler (ه) ؛)) كسر ؛)

في تنفيذ متزامن لonreadystatechange ، بيان التبديل تنفذ واحدة من أربع ولايات جاهزة صالحة. من المصدر ، يمكنك ربط كل رقم مع دولة معينة. الدولة الأكثر أهمية هو استعداد 4 ، مشيرا إلى أن محتوى تم استرجاعها ، وتحميلها ، وتجهيزها. الدولة مستعدة 4 يستدعي الأسلوب المحدد من قبل العميل في ضبط الممتلكات. إشعار في تنفيذ المهمة الموكلة onreadystatechange أن المتغير سبيل المثال قد حلت محل إشارة إلى هذا.

تنفيذ الدالة onreadystatechange هو مبالغة ، باعتبار أن 98 ٪ من الوقت يمكنك استخدام غير متزامن سوف نهتم فقط في حالة استعداد لل4. بالنسبة لجميع الدول الأخرى مستعدة ، اعتمادا على المتصفح ، وظيفة معينة أمر ممكن. وبسبب هذا التضارب وعدم اكتمال الكائن XMLHttpRequest دولة ، ليست هناك حاجة حقيقية لعملية في ولايات أخرى جاهزة. أما النسبة المتبقية وهي الكلمة الدالة رمز ينطوي على إرسال الطلب إلى الملقم باستخدام ارسال الدالة :

حاول (this.xmlhttp.send (request.data) ؛) الصيد (ه) (globals.errorHandler (ه) ؛)

وترسل الدالة يستخدم في صنع وبناء على طلب المادية إلى الخادم. وظيفة ، كما تستخدم لإرسال أي بيانات مرتبطة مع هذا الطلب. إذا لم تكن هناك بيانات ، ثم استدعاء ترسل مع قيمة فارغة لن يولد خطأ ، وعندما ترسل الطريقة جعلت طلبها ، فإنه يعود على الفور ، وجافا سكريبت Asynchronous_call الدالة سيعود التحكم إلى المستعرض. في هذا الوقت ، يجب على العميل إضافة بعض رمز لعدم السماح المكالمات متعددة. على سبيل المثال ، إذا كان هذا الطلب تم تفعيلها باستخدام زر ، ثم طلب حتى عاد ، على زر يمكن تعطيلها. بطبيعة الحال ، وهذا يدخل مشكلة محتملة إذا كان هذا الطلب أبدا بإرجاع والزر يبقى معطلا. لحل هذه المشكلة ، يمكنك ادخال الموقت التي تمنح بناء على طلب لأقصى قدر ممكن من الوقت. إذا كان في ذلك الوقت ، فإن الطلب لا يزال لم أفلح ، وطريقة XMLHttpRequest.abort يسمى ويتم تمكين الزر مرة أخرى.

مقال مقدم من سونيا Lande


تنويه :موقعنا على الانترنت ليست مسؤولة عن محتوى هذه المادة. Webarticles هو حر للمعلومات.
المهم : هذه المادة "تنفيذ فئة غير متزامن في اياكس" وقد ترجم من قبل البرمجيات التلقائي. نشعر بالاسف من اجل أي الأخطاء الإملائية التي قد حدث. شكرا لتفهمكم.


Online: 455 users browsing the articles directory