for循环当中使用定时器的注意事项

实际开发过程中遇到这样的需求,页面加载后会请求多个数据模块,每个模块都进行进度条展示,从零到目标值给一个增长效果。于是给每个子元素绑定一个定时器setInterval,像这样:


效果确是这样的:


完全错乱了,这可不是我想要的效果呀!

查阅资料后才知道,当我们在for循环里面调用定时器时,定时器时异步执行的,没循环一次,i加1,生成一个timer,放到进程队列里面去,等到for循环完成后,i已经加到最大值了,退出循环,这时再来执行定时器,此时用的i是最后的那个值,所以每个定时器处理函数就会共享同一作用域里的同一变量"i",导致上面有颜色的模块的进度条没能被处理到,只有最后的进度条值在不停的增长。

那么怎么解决呢?我们可以通过定义一个函数来实现中介作用,从而创建变量副本由于setInterval()副本上下文中调用的,所以它每次都自己的私有的"i"以供使用:


这样就达到想要的效果了,每个模块都单独绑定了一个timer,i也是独立的了:


猜你喜欢

转载自blog.csdn.net/dongguan_123/article/details/79800833