تتيح ميزة الخيوط الواحدة لمحرك JavaScript من الممكن أن تتمثل مؤشرات الترابط الحصرية لفترة طويلة عند التعامل مع اجتياز حلقة كبير ، مما يؤدي إلى عدم قدرة أحداث أخرى (مثل عمليات المستخدم) على الاستجابة في الوقت المناسب ، وفي الحالات الشديدة يمكن أن تسبب تأخرًا أو حتى موتًا مزيفًا. لحل المشكلة أعلاه ، تتمثل الآلية الممكنة في تقسيم الحلقة الكبيرة إلى عدة شظايا حلقة صغيرة لتنفيذ شظايا ، بحيث يتمتع محرك JavaScript بفرصة لإدراج وتنفيذ أشياء أخرى بين القطاعات ، وبالتالي تحسين تجربة الأداء بشكل فعال.
Ansync.js
نسخة الكود كما يلي:
وظيفة ansync (TotalCount ، SegmentCount ، WorkCallback ، ReturnCallback)
{
var num_of_item_for_each_segress = segmentCount ؛
var num_of_segress = math.ceil (TotalCount / num_of_item_for_each_segress) ؛
var count_of_segress = 0 ؛
var timer ؛
var start ، end ؛
this.process = وظيفة (نطاق ، مهلة)
{
إذا (النطاق! = غير محدد)
{
workcallback = workcallback.bind (Scope) ؛
ReturnCallback = returnCallback؟ returncallback.bind (النطاق): غير محدد ؛
}
if (count_of_segment == num_of_segment)
{
ClearTimeout (مؤقت) ؛
إذا (returncallback! = غير محدد)
returncallback () ؛
}
آخر
{
start = count_of_segress * num_of_item_for_each_segress ؛
end = math.min (totalCount ، (count_of_segress + 1) * num_of_item_for_each_segress) ؛
if (num_of_segment == 1) // لا تحتاج إلى إنشاء مؤقت
{
WorkCallback (ابدأ ، نهاية) ؛
count_of_segress = 1 ؛
this.process () ؛
}
آخر
{
Timer = setTimeOut (وظيفة ansynctimeout () {
إذا (workcallback (ابدأ ، نهاية)) // الانتهاء من العملية إذا كانت الوظيفة تُرجع صحيحًا
{
count_of_segress = num_of_segress ؛
}
آخر
{
count_of_segment ++ ؛
}
this.scope.process () ؛
} .bind ({Scope: this}) ، timeout == غير محدد؟ Ansync.timeout: timeout) ؛
}
}
}
}
Ansync.timeout = 5 ؛
الطريقة بسيطة للغاية ، لكنها عملية للغاية. يرجى الرجوع إليها إذا كان لديك نفس متطلبات المشروع.