سؤال

مشكلتي هي التالية. كتبت فئة AJAXENGINE، والتي تنشئ في المنشئ كائن جديد XMLHTTPRequest جديد. تحتوي الفصل على طريقة تسمى ResponseAnalyser، والتي يتم استدعاؤها عند تغيير كائن "OnreadyStatechange" لكائن XMLHTPRequest. لذلك الآن قمت بإنشاء دعونا نقول 4 مثيلات AJAXENGINE => 4 كائنات xmlhttprequest.

الآن لدي Datarequester فئة أخرى، والتي تحتوي على Datareq لسمة صفيف، والتي تحمل مثيلات AjaxEngine. هناك مثيل واحد فقط من DatareQeuster في البرنامج بأكمله! Datarequester لديه وظيفة تسمى callwhenfinished. يتم استدعاء الوظيفة، من خلال وظيفة Responseanalyser AjaxEngine وتدفق متغير مثيل Datarequester.

ولكن، أعتقد أن هناك ظروف السباق. كيف يمكنني أن تفضلهم في جافا سكريبت؟

function AJAXEngine
{
 this.httpReqObj = //create new XMLHttpRequest Object
 this.obj;
 this.func;
}
AJAXEngine.prototype.responseAnalyser = function()
{
 if(this.httpReqObj.readState == 4)
 {
  this.func.call(this.obj);
 }
}
AJAXEngine.prototype.fireReq = function(o, f)
{
 this.obj = o;
 this.func = f;
 // fire ajax req
}

function DataRequester()
{
 this.dataReq = new Array();
 this.test = 4;

 for(var i = 0; i < 4; i ++)
 {
  this.dataReq[i] = new AJAXEngine();
 }
}
DataRequester.prototype.callWhenFinished = function()
{
 this.test --;
}
هل كانت مفيدة؟

المحلول

لست متأكدا مما إذا كان هذا من شأنه أن يساعد، ولكن يبدو أنك تحاول إنشاء تجمع اتصال مدار. فعلت واحدة قبل بضع سنوات لا يزال يعمل بشكل جيد هنا:

مكتبة dp_requestpool

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

إذا لم يكن هناك شيء آخر قد يوفر لك بعض الأفكار.

نصائح أخرى

بادئ ذي بدء: معظم اتفاقية دعم المتصفحات الموجهة نحو AJAX "فقط 2 طلبات متزامنة لنفس المجال". لذلك إذا بدأت 4، فسيتم معلقة 2 منهم.

أنت datareqeuster / singleton / يمكن أن يكون لها مجموعة من "اختبار" متغير، لذلك بدلا من مشاركة متغير واحد عبر مثيلات متعددة، قم بإنشاء مثيلات متعددة من البيانات. لذا حساب النتيجة، ستحتاج إلى مجموع صفيف "اختبار".

ستحتاج إلى تنفيذ MUTEX مؤقتا (الفكرة هي أن محاربة ستتحقق من وجود BOOL وتعيينها إلى True إذا كانت خاطئة إذا فعلت الجسم، وإلا ينام (Settimeout؟) - من الواضح أن هذا مزعجة سيئة للغاية لن ينفذ أحد نظرا لأنها ليست آمنة الخيط، ولكن هذا هو المفهوم العام لكيفية التعامل مع ظروف السباق على أي حال).

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

لا يمكنك القيام بمثابة Mutex في JavaScript ببساطة لأن هناك حقا لا توجد وظيفة مبنية في النوم المتاحة.

يرى: هل هناك وظيفة ما يعادل جافا سكريبت أو وظيفة السكون جيس؟

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

لذلك نصيحتي، إذا كان لديك خطأ في الحصول على خطأ، من المحتمل ألا بسبب حالة السباق.

ما رأيك في المقالة التالية؟ أنا فقط وجدت ذلك في جوجل

http://www.developer.com/lang/jscript/article.php/3592016.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top