一、需求描述
如“1234”,按位数读1、2、3、4,且每位之间间隔1s
二、代码逻辑
function speakNumber2(no,len,i){ // no='1234',len=4,i=0
if(i ≥ len){
clearTimeout(s) ;
}else {
soundAlert("sound_"+no.charAt(i));
s = setTimeout(speakNumber2(no,len,++i), 1000);
}
}
问题:在1s内把1、2、3、4一下读出来了
思路:改用setInterval,问题仍存在
改为:s = setInterval(speakNumber2(no,len,++i), 1000*i);问题仍存在
三、分析
因为回调函数传参数问题;
重写setTimeOut方法,问题解决
var __sto = setTimeout;
window.setTimeout = function(callback,timeout,param)
{
var args = Array.prototype.slice.call(arguments,2);
var _cb = function()
{
callback.apply(null,args);
}
__sto(_cb,timeout);
}
function speakNumber2(no){
var len = no.length;
for (var i = 0; i < len; i++) {
setTimeout(soundAlert, 500*i, "sound_merge"+no.charAt(i)); //第i个数,在第 500*i s 时执行
}
}
相关推荐
最近在翻看以前的老书《node.js开发指南》,恰好碰到 for 循环 + setTimeout 的经典例子,于是重新梳理了思路并记录下。 二、写在前面,setTimeout 和 setInterval 的执行机制 在日常编码中,你会发现,给 ...
主要介绍了vue项目开发中setTimeout等定时器的管理问题,需要的朋友可以参考下
今天小编就为大家分享一篇解决循环中setTimeout执行顺序的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
本文主要介绍了使用setTimeout实现防止循环超时的方法,具有很好的参考价值。下面跟着小编一起来看下吧
setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则是在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除。也就是说setTimeout()只执行一次,setInterval()可以执行多...
js 代码中执行循环事件时,经常会用到 setInterval 和 setTimeout 这两个方法,关于这两个方法的细节这里不详细讨论了,简要分享下在需要停止循环事件的时候该如何操作。 (1)setInterval 方法可按照指定的周期(以...
上个周日,介绍了如何使用setTimeout代替setInterval进行间歇调用,这个周日,继续来讲《JavaScript高级程序设计》这本书里面,对于setTimeout的另一种妙用——防止循环超时 【这是铺垫,为故事的高潮埋下伏笔】 ...
解决以上的问题可以采用自执行的匿名函数 function f2(){ for(var i = 0; i < 10; i++) { (function(e) { setTimeout(function() { alert(e); }, 1000); })(i); } } f2(); 这里的匿名
这是事件循环机制,因为js是单线程的,是基于事件循环的。而setTimeout函数是异步的,异步的事件会加入一个队列,会等到当前同步的任务执行完毕后,再执行setTimeout队列的任务。所以,通过设置任务在延迟0毫秒后...
setInterval:可定时循环回调 第一次这样使用: setTimeout(function(){ console.log(延时1秒回调) },1000) setInterval(function(){ console.log(每隔2秒回调一次) },2000) 但性能测试后发现存在定时器未跟随...
定时执行:var tmid = window.setTimeout(“方法名或方法”, “延时”);window.clearTimeout(tmid); 举例说明: A.当要执行的方法中不需要参数时 代码如下: [removed] //循环执行,每隔3秒钟执行一次showalert() ...
IE没有我们想象中笨,它知道总的循环次数还是一千万次。因此,得把这一百个十万次循环分开执行。虽然Javascript是单线程的,但也可以通过setTimeout或setInterval模拟多线程。
用php实现的循环计数器 <!...<...<head> <... charset=utf-8" />...echo "else setTimeout(\"shw();\",1000);"; echo "}"; echo "shw();"; echo "[removed]"; } timer(); ?> </body> </html>
setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则是在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除。也就是说setTimeout()只执行一次,setInterval()可以执行多...
该方法会不停地循环调用函数,直到使用 clearInterval() 明确停止该函数或窗口被关闭。clearInterval() 函数的参数即 setInterval() 返回的 ID 值。 语法 setInterval(code,millisec[,”lang”])code 必需。要调用的...
主要应用setTimeout()方法实现图片的循环滚动效果。setTimeout()方法的语法格式如下: setTimeout(function,milliseconds,[arguments]) 参数说明: a. function:要调用的JavaScript自定义函数名称。 b. ...
问题: jquery对数组进行循环,如果要求每次循环的时候暂停2秒钟,在使用jQuery的.earch循环的时候,无论怎么设置,都不会暂停。 setTimeout也只是在第一次执行的时候暂停。 原因猜测: js开始执行多线程? 改进: ...
22、事件循环异步:定时器、ajax、onclick、promise(new Promise立刻执行,then异步)宏任务:定时器(setTimeout、set