`
yanzhu2011
  • 浏览: 17233 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

setTimeout循环问题

 
阅读更多

一、需求描述

      如“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 时执行
                }
               }

 

 

分享到:
评论

相关推荐

    for循环 + setTimeout 结合一些示例(前端面试题)

    最近在翻看以前的老书《node.js开发指南》,恰好碰到 for 循环 + setTimeout 的经典例子,于是重新梳理了思路并记录下。 二、写在前面,setTimeout 和 setInterval 的执行机制 在日常编码中,你会发现,给 ...

    vue项目开发中setTimeout等定时器的管理问题

    主要介绍了vue项目开发中setTimeout等定时器的管理问题,需要的朋友可以参考下

    解决循环中setTimeout执行顺序的问题

    今天小编就为大家分享一篇解决循环中setTimeout执行顺序的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    js中setTimeout的妙用--防止循环超时

    本文主要介绍了使用setTimeout实现防止循环超时的方法,具有很好的参考价值。下面跟着小编一起来看下吧

    Javascript中setTimeOut和setInterval的定时器用法

    setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则是在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除。也就是说setTimeout()只执行一次,setInterval()可以执行多...

    JavaScript中停止执行setInterval和setTimeout事件的方法

    js 代码中执行循环事件时,经常会用到 setInterval 和 setTimeout 这两个方法,关于这两个方法的细节这里不详细讨论了,简要分享下在需要停止循环事件的时候该如何操作。 (1)setInterval 方法可按照指定的周期(以...

    js中setTimeout的妙用–防止循环超时

    上个周日,介绍了如何使用setTimeout代替setInterval进行间歇调用,这个周日,继续来讲《JavaScript高级程序设计》这本书里面,对于setTimeout的另一种妙用——防止循环超时  【这是铺垫,为故事的高潮埋下伏笔】 ...

    采用自执行的匿名函数解决for循环使用闭包的问题

    解决以上的问题可以采用自执行的匿名函数 function f2(){ for(var i = 0; i < 10; i++) { (function(e) { setTimeout(function() { alert(e); }, 1000); })(i); } } f2(); 这里的匿名

    设置setTimeout延时为0ms的作用

     这是事件循环机制,因为js是单线程的,是基于事件循环的。而setTimeout函数是异步的,异步的事件会加入一个队列,会等到当前同步的任务执行完毕后,再执行setTimeout队列的任务。所以,通过设置任务在延迟0毫秒后...

    小程序笔记—性能测试下的定时器:setTimeout与setInterval

    setInterval:可定时循环回调 第一次这样使用: setTimeout(function(){ console.log(延时1秒回调) },1000) setInterval(function(){ console.log(每隔2秒回调一次) },2000) 但性能测试后发现存在定时器未跟随...

    Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)

    定时执行:var tmid = window.setTimeout(“方法名或方法”, “延时”);window.clearTimeout(tmid); 举例说明: A.当要执行的方法中不需要参数时 代码如下: [removed] //循环执行,每隔3秒钟执行一次showalert() ...

    js 优化次数过多的循环 考虑到性能问题

    IE没有我们想象中笨,它知道总的循环次数还是一千万次。因此,得把这一百个十万次循环分开执行。虽然Javascript是单线程的,但也可以通过setTimeout或setInterval模拟多线程。

    php循环计数

    用php实现的循环计数器 <!...<...<head> <... charset=utf-8" />...echo "else setTimeout(\"shw();\",1000);"; echo "}"; echo "shw();"; echo "[removed]"; } timer(); ?> </body> </html>

    javascript中SetInterval与setTimeout的定时器用法

    setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则是在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除。也就是说setTimeout()只执行一次,setInterval()可以执行多...

    js中的setInterval和setTimeout使用实例

    该方法会不停地循环调用函数,直到使用 clearInterval() 明确停止该函数或窗口被关闭。clearInterval() 函数的参数即 setInterval() 返回的 ID 值。 语法 setInterval(code,millisec[,”lang”])code 必需。要调用的...

    JavaScript代码实现图片循环滚动效果

    主要应用setTimeout()方法实现图片的循环滚动效果。setTimeout()方法的语法格式如下: setTimeout(function,milliseconds,[arguments]) 参数说明: a. function:要调用的JavaScript自定义函数名称。 b. ...

    jQuery及JS实现循环中暂停的方法

    问题: jquery对数组进行循环,如果要求每次循环的时候暂停2秒钟,在使用jQuery的.earch循环的时候,无论怎么设置,都不会暂停。 setTimeout也只是在第一次执行的时候暂停。 原因猜测: js开始执行多线程? 改进: ...

    smileyqp#frontend_book#22、事件循环1

    22、事件循环异步:定时器、ajax、onclick、promise(new Promise立刻执行,then异步)宏任务:定时器(setTimeout、set

Global site tag (gtag.js) - Google Analytics