Tidak ada metode tidur di JS. Jika Anda ingin hibernasi, Anda harus mendefinisikan metode sendiri.
function sleep (numbermillis) {var now = new date (); var exitTime = now.getTime () + numbermillis; while (true) {now = new date (); if (now.getTime ()> exittime) kembali; }}Berikut ini adalah tambahannya:
Selain JS naratif, JWACS (JavaScript dengan Dukungan Lanjutan Advanced) juga berkomitmen untuk menghindari menulis fungsi panggilan balik yang merepotkan secara asinkron disebut dengan memperluas sintaks JavaScript. Tidur yang diimplementasikan dengan JWACS, kodenya adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
function sleep (msec) {
var k = function_continuation;
setTimeout (function () {resume k <- mesc;}, msec);
menskors;
}
Sintaks ini bahkan lebih menakutkan, dan itu adalah nama metode utas yang tidak direkomendasikan di Java. Terus terang saya cenderung menuju naratif JS.
Seperti naratif JS, JWAC juga perlu dikompilasi, dan precompiler ditulis dalam bahasa LISP. Ini juga versi alfa saat ini. Untuk pengantar dan perbandingan lebih lanjut dari keduanya, silakan merujuk ke artikel baru tentang Sitepoint: Menghilangkan Callback Async JavaScript dengan preprocessing
Saat menulis skrip JavaScript yang kompleks, kadang -kadang ada kebutuhan untuk berharap bahwa skrip dapat berhenti untuk periode waktu tertentu, mirip dengan efek yang dicapai oleh utas. Tidur di Java atau perintah tidur dalam skrip SH.
Seperti yang kita semua tahu, JavaScript tidak memberikan fungsi kontrol utas yang mirip dengan Java. Meskipun ada dua metode, setTimeout dan setInterval, yang dapat melakukan beberapa kontrol eksekusi waktunya, mereka tidak dapat memenuhi semua persyaratan. Selalu ada banyak orang yang bertanya bagaimana menerapkan tidur/jeda/menunggu di JavaScript, dan memang ada beberapa solusi yang sangat timpang:
Cara termudah dan terburuk adalah dengan menulis satu lingkaran, kodenya mungkin sebagai berikut:
Salinan kode adalah sebagai berikut:
function sleep (numbermillis) {
var sekarang = tanggal baru ();
var exitTime = now.getTime () + numbermillis;
while (true) {
sekarang = tanggal baru ();
if (now.gettime ()> exittime)
kembali;
}
}
Kode di atas sebenarnya tidak tidur penerjemah skrip, dan juga memiliki efek dengan cepat meningkatkan CPU ke beban tinggi. Browser bahkan akan berada dalam keadaan kematian palsu untuk periode waktu itu.
Kedua, orang pintar menggunakan implementasi kotak dialog khusus IE untuk terhubung satu sama lain. Kode mungkin sebagai berikut:
Salinan kode adalah sebagai berikut:
function sleep (timeout) {
window.showmodaldialog ("javascript: document.writeln ('<script> window.setTimeout (function () {window.close ();}," + timeout + "); <// script>');");
} window.alert ("Sebelum tidur ...");
Sleep (2000);
window.alert ("Setelah tidur ...");
Tak perlu dikatakan, hanya dukungan IE (IE7 tidak dapat mencapai tujuannya karena pembatasan keamanan).
Selain itu, ada juga trik seperti menggunakan applet atau memanggil windows script's host.sleep (), yang semuanya merupakan upaya terakhir.
Akhirnya, ada orang yang lebih pintar yang telah mengembangkan mungkin solusi terbaik. Mari kita lihat kode terlebih dahulu:
Salinan kode adalah sebagai berikut:
function sleep (millis) {
var notifier = njsruntime.createnotifier ();
setTimeout (pemberi tahu, millis);
notifier.wait-> ();
}
Itu benar, melihat sintaks -> () menakjubkan karena melihat fungsi prototipe $ (). Namun, skrip ini akan melaporkan kesalahan sintaksis secara langsung di browser. Bahkan, mereka perlu dikompilasi menjadi JavaScript yang disetujui oleh browser klien. Skrip yang dikompilasi adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
function sleep (millis) {
var njf1 = njen (ini, argumen, "millis");
nj: while (1) {
coba {switch (njf1.cp) {
kasus 0: njf1._notifier = njsruntime.createNotifier ();
setTimeout (njf1._notifier, njf1._millis);
njf1.cp = 1;
njf1._notifier.wait (njf1);
kembali;
Kasus 1: Break NJ;
}} catch (ex) {
if (! njf1.except (ex, 1))
kembali;
}}
njf1.pf ();
}
Saya tidak bisa memahaminya, dan saya tidak ingin memahaminya lagi. Semua tugas ini akan diimplementasikan oleh Narrative JavaScript - ekstensi JS yang menyediakan fungsionalitas pemblokiran asinkron bagi kami. Kita hanya perlu menulis sintaksis aneh -> () sebelumnya, dan kemudian mengimplementasikan efek tidur melalui kompilasi pra -statis atau kompilasi dinamis dari latar depan.
Narasi JavaScript mengklaim untuk membebaskan Anda dari fungsi panggilan balik pusing dan menulis tugas yang sudah berjalan dengan jelas. Saat ini, masih merupakan versi alpha, dan ada contoh tombol bergerak pada halaman contoh. Unduh kode sumber juga tersedia di beranda. Dengan pengetahuan dasar saya yang lemah, saya hanya tidak dapat melihat bahwa implementasi mesin negara disimulasikan dalam kode. Saya berharap teman -teman yang mahir dalam algoritma dapat menguraikannya untuk kita.
Akhirnya, saya selalu memiliki sudut pandang saya: Harap jaga javascript sederhana kecuali itu perlu. Sebelum JavaScript dapat memberikan dukungan threading asli, mungkin kita dapat mengubah desain untuk menghindari aplikasi pemblokiran asinkron.
Implementasi serangga yang berliku -liku
<Jenis skrip "Teks/JavaScript">/*Implementasi fungsi jeda dalam JavaScript JavaScript itu sendiri tidak memiliki fungsi jeda (tidur tidak dapat digunakan) pada saat yang sama, VBScript tidak dapat menggunakan doevents, jadi tulis fungsi ini untuk mengimplementasikan fungsi ini. JavaScript adalah bahasa objek yang lemah, dan fungsi juga dapat digunakan sebagai objek. Misalnya: [kode] test fungsi () {alert ("hellow"); this.nextStep = function () {alert ("nextStep"); }} Kita dapat memanggil var mytest = test baru (); mytest.nextstep (); Ketika kita melakukan jeda, suatu fungsi dapat dibagi menjadi dua bagian, yang tidak berubah sebelum operasi jeda, dan meletakkan kode untuk dieksekusi setelah jeda di this.nextstep. Untuk mengontrol jeda dan kelanjutan, kita perlu menulis dua fungsi untuk mengimplementasikan fungsi jeda dan kelanjutan masing -masing. Fungsi jeda adalah sebagai berikut: */fungsi jeda (obj, iminsecond) {if (window.eventList == null) window.eventList = array baru (); var ind = -1; untuk (var i = 0; i <window.eventList.length; i ++) {if (window.eventList [i] = null) {window.eventlist [i] = obj; ind = i; merusak; }} if (ind ==-1) {ind = window.eventList.length; window.eventlist [ind] = obj; } setTimeOut ("Goon (" + ind + ")", 1000);}/*Fungsi ini menempatkan fungsi untuk dijeda ke jendela array. Fungsi berkelanjutan adalah sebagai berikut: */function Goon (ind) {var obj = window.eventlist [ind]; window.eventlist [ind] = null; if (obj.nextstep) obj.nextstep (); lain obj ();}/*Fungsi ini memanggil metode NextStep dari fungsi yang ditangguhkan. Jika metode ini tidak tersedia, fungsi akan dipanggil lagi. Setelah fungsi ditulis, kita dapat menulis volume berikut: */function test () {alert ("hellow"); Jeda (this, 1000); // Memanggil fungsi jeda this.nextSpep = function () {alert ("nextStep"); }} </script>