setTimeout() 方法在for循环中失效?

一、代码先行

{
     var progressNum=0;
     var that = this;
     var timestep=100;
     for (progressNum = 0; progressNum <= 100; progressNum++)
    {
       timestep = (100 - progressNum) * 10;
       var myvar = setTimeout(function(){
        that.setData(
          {
            progress:progressNum
          }
        )
      console.log(progressNum);
      console.log("setTimeout success!")
       },timestep);
      console.log('timestep'+timestep);
    }

二、运行结果


。。。


。。。


三、代码分析

想使用以上代码实现:在for循环中不断改变timestep的值,使得时延不断减少。

但从结果看,未能达到预期效果!从控制台的输出看,timestep的参数输出是正常的,但是progressNum的输出却是不正常的,只输出了一个跳出循环时的最大值101,没有从0开始递增。同时console.log('timestep'+timestep);语句执行完后才去执行 console.log(progressNum);和 console.log("setTimeout success!")似乎与程序的顺序执行规则不符合,因为后面两个语句在前面。

问题分析,本质上是由于for循环中的setTimeout()的执行和for循环的执行是独立的,也就是说在第一次执行setTimeout()的时候,for循环并没有停止下来,而是以极快的速度继续执行下去,等到setTimeout()等待时间到了,for循环已经执行完毕,progressNum已经变为101。导致这个错误的原因就是对setTimeout()的原理理解不清楚,把它当作C语言中的delay()函数使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值