Rumah  >  Artikel  >  hujung hadapan web  >  Kaedah tersuai dalam js untuk melaksanakan teknik tidur selama beberapa saat_javascript

Kaedah tersuai dalam js untuk melaksanakan teknik tidur selama beberapa saat_javascript

WBOY
WBOYasal
2016-05-16 16:42:091587semak imbas

Tiada kaedah tidur terbina dalam dalam js Jika anda ingin tidur, anda perlu menentukan sendiri kaedah

function sleep(numberMillis) { 
var now = new Date(); 
var exitTime = now.getTime() + numberMillis; 
while (true) { 
now = new Date(); 
if (now.getTime() > exitTime) 
return; 
} 
}

Berikut ialah suplemen:

Selain Narrative JS, jwacs (Javascript With Advanced Continuation Support) juga komited untuk melanjutkan sintaks JavaScript untuk mengelakkan penulisan fungsi panggil balik yang menyusahkan untuk panggilan tak segerak. Tidur dilaksanakan menggunakan jwacs, kodnya adalah seperti berikut:

Salin kod Kod adalah seperti berikut:

fungsi tidur(msec) {
var k = fungsi_sambungan;
setTimeout(function() { resume k 6ac2f255209baceecb2911736a1ad256 exitTime)
             kembali;
}
}

Kod di atas sebenarnya tidak menyebabkan penterjemah skrip tidur, tetapi mempunyai kesan sampingan iaitu dengan cepat meletakkan CPU di bawah beban tinggi. Penyemak imbas mungkin juga tergantung dalam animasi yang digantung untuk tempoh masa itu.

Kedua, terdapat orang pintar yang menggunakan pelaksanaan kotak dialog khas IE untuk mencari jalan keluar Kod tersebut mungkin seperti berikut:

Salin kod Kod adalah seperti berikut:

fungsi tidur(masa tamat) {
window.showModalDialog("javascript:document.writeln('3f1c4e4b6b16bbbd69b2ee476dc4f83awindow.setTimeout(function () { window.close(); }, " timeout ");2cacc6d41bbb37262a98f745aa00fbf0');");
}window.alert("sebelum tidur ...");
tidur(2000);
window.alert("selepas tidur ...");

Tidak perlu dikatakan, kelemahannya ialah ia hanya disokong oleh IE (IE7 tidak dapat mencapai tujuan kerana sekatan keselamatan).

Selain perkara di atas, terdapat juga idea bijak seperti menggunakan Applet atau memanggil WScript.Sleep() dari Windows Script Host Ini semua adalah pilihan terakhir.

Akhirnya, orang yang lebih bijak telah membangunkan penyelesaian terbaik. Mari kita lihat kodnya dahulu:

Salin kod Kod adalah seperti berikut:

fungsi tidur(millis) {
var notifier = NjsRuntime.createNotifier();
setTimeout(pemberitahu, millis);
Pemberitahu.tunggu->();
}

Ya, melihat sintaks seperti ->() sama mengejutkan saya seperti melihat fungsi $() Prototaip. Walau bagaimanapun, skrip ini akan melaporkan ralat sintaks secara langsung dalam penyemak imbas. Malah, mereka perlu diprasusun ke dalam JavaScript yang diiktiraf oleh penyemak imbas pelanggan. Skrip yang disusun adalah seperti berikut:

Salin kod Kod adalah seperti berikut:

function sleep(millis){
var njf1 = njen(this,arguments,"millis");
nj:while(1) {
try{switch(njf1.cp) {
case 0:njf1._notifier=NjsRuntime.createNotifier();
setTimeout(njf1._notifier,njf1._millis);
njf1.cp = 1;
njf1._notifier.wait(njf1);
return;
case 1:break nj;
}} catch(ex) {
if(!njf1.except(ex,1))
return;
}}
njf1.pf();
}

我看不懂,也不想去看懂了。这些工作全部会由 Narrative JavaScript ———— 一个提供异步阻塞功能的JS扩展帮我们实现。我们只需要编写之前那个怪异的 ->() 语法, 然后通过后台预先静态编译或者前台动态编译后执行就可以实现 sleep 的效果。
Narrative JavaScript 宣称可以让你从头昏眼花的回调函数中解脱出来,编写清晰的Long Running Tasks。目前还是 alpha 的版本,在 Example 页面上有一个移动的按钮的范例。首页上也提供了源码下载。以我薄弱的基础知识,我只能勉强的看出代码中模拟了状态机的实现,希望有精通算法的朋友能为我们解析。
最后,还是我一直以来的观点: 除非很必要,否则请保持JavaScript的简单。在JavaScript 能提供原生的线程支持之前,或许我们可以改变设计以避免异步阻塞的应用。

有bug的曲折实现

<script type"text/javascript">
/*Javascript中暂停功能的实现
Javascript本身没有暂停功能(sleep不能使用)同时 vbscript也不能使用doEvents,故编写此函数实现此功能。
javascript作为弱对象语言,一个函数也可以作为一个对象使用。
比如:

[code]
function Test(){
 alert("hellow");
 this.NextStep=function(){
 alert("NextStep");
 }
}
我们可以这样调用 var myTest=new Test();myTest.NextStep();
我们做暂停的时候可以吧一个函数分为两部分,暂停操作前的不变,把要在暂停后执行的代码放在this.NextStep中。
为了控制暂停和继续,我们需要编写两个函数来分别实现暂停和继续功能。
暂停函数如下:
*/
function Pause(obj,iMinSecond){
 if (window.eventList==null) window.eventList=new Array();
 var ind=-1;
 for (var i=0;i<window.eventList.length;i++){
 if (window.eventList[i]==null) {
  window.eventList[i]=obj;
  ind=i;
  break;
 }
 }
 
 if (ind==-1){
 ind=window.eventList.length;
 window.eventList[ind]=obj;
 }
 setTimeout("GoOn(" + ind + ")",1000);
}
/*
该函数把要暂停的函数放到数组window.eventList里,同时通过setTimeout来调用继续函数。
继续函数如下:
*/

function GoOn(ind){
 var obj=window.eventList[ind];
 window.eventList[ind]=null;
 if (obj.NextStep) obj.NextStep();
 else obj();
}
/*
该函数调用被暂停的函数的NextStep方法,如果没有这个方法则重新调用该函数。
函数编写完毕,我们可以作如下册是:
*/
function Test(){
 alert("hellow");
 Pause(this,1000);//调用暂停函数
 this.NextStep=function(){
 alert("NextStep");
 }
}
</script>
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn