Fitur satu threading dari mesin JavaScript memungkinkan untuk utas eksklusif untuk waktu yang lama ketika menangani traversal loop besar, menghasilkan peristiwa lain (seperti operasi pengguna) yang tidak dapat merespons pada waktunya, dan dalam kasus yang parah dapat menyebabkan kelambatan atau bahkan kematian palsu. Untuk menyelesaikan masalah di atas, mekanisme yang layak adalah membagi loop besar menjadi beberapa fragmen loop kecil untuk menjalankan fragmen, sehingga mesin JavaScript memiliki peluang untuk memasukkan dan melaksanakan hal -hal lain di antara segmen, sehingga secara efektif meningkatkan pengalaman kinerja.
Ansync.js
Salinan kode adalah sebagai berikut:
Fungsi ansync (TotalCount, SegmentCount, WorkCallback, ReturnCallback)
{
var num_of_item_for_each_segment = segmentCount;
var num_of_segment = math.ceil (totalCount / num_of_item_for_each_segment);
var count_of_segment = 0;
var timer;
var start, end;
this.process = function (scope, timeout)
{
if (scope! = tidak terdefinisi)
{
workcallback = workcallback.bind (lingkup);
returnCallback = returnCallback? returncallback.bind (lingkup): tidak ditentukan;
}
if (count_of_segment == num_of_segment)
{
ClearTimeout (timer);
if (returnCallback! = tidak terdefinisi)
returnCallback ();
}
kalau tidak
{
start = count_of_segment * num_of_item_for_each_segment;
end = math.min (totalCount, (count_of_segment + 1) * num_of_item_for_each_segment);
if (num_of_segment == 1) // tidak perlu membuat timer
{
workcallback (start, end);
count_of_segment = 1;
this.process ();
}
kalau tidak
{
timer = setTimeout (fungsi ansynctimeout () {
if (workcallback (start, end)) // finish proses jika fungsi mengembalikan true
{
count_of_segment = num_of_segment;
}
kalau tidak
{
count_of_segment ++;
}
this.scope.process ();
} .bind ({scope: this}), timeout == tidak terdefinisi? Ansync.timeout: timeout);
}
}
}
}
Ansync.timeout = 5;
Metode ini sangat sederhana, tetapi sangat praktis. Silakan merujuk jika Anda memiliki persyaratan proyek yang sama.