关于javascript:再次理解异步setTimeout-方法

40次阅读

共计 1037 个字符,预计需要花费 3 分钟才能阅读完成。

先看一段代码:

console.log('-',new Date().getTime())
    for(let i = 0;i<100;i++){setTimeout(function(){console.log('exeute');
          },100);
    }
    console.log('i',new Date().getTime())

执行后果:

- 1610778978900
i 1610778978901
100 exeute

看第一个 log 跟第二个 log 工夫只相差了 1ms,工夫短到简直距离为 0.

再看一段代码:

console.log('-',new Date().getTime())
    for(let i = 0;i<100000;i++){setTimeout(function(){console.log('exeute');
          },100);
    }
    console.log('i',new Date().getTime())

执行后果

- 1610779277393
i 1610779278304
4466 exeute

过一会再去看,期间程序始终在执行,电脑还差点卡死了...
- 1610779277393
i 1610779278304
13188 exeute
不出意外的状况下,你会最终看见打印后果逐步减少到 10 万。法则感觉如下:一开始很快的增长到上千上万(简直是同时进行的)而后逐渐递增到 10 万。

第二段代码 log 工夫相差了 911ms。
从 eventLoop 异步原理,先进先出,后进后出逻辑来看的确后果如咱们所愿。但为何在第一段代码里,咱们会同时看见打印了 100 次 exeute 呢?

log 和工夫 time 的曲线仿佛出现如下:

在后面很短雷同的工夫里,同时打印 excute, 随后 time 逐步减少。
其实在 A 这个区块内,也是满足先进先出后进后出的逻辑的,一段近乎程度
的增长曲线(能够了解成前半部分,比方 i 取 100 个的时候,“简直”是同时 log,这里无穷小的工夫能够了解成 0,所以在 A 这个区域,咱们肉眼看见的先进先出没察看到

这里用到 setTimeout 的知识点:
1、待退出队列的音讯和一个工夫值(可选,默认为 0)。这个工夫值代表了音讯被理论退出到队列的最小延迟时间 。如果队列中没有其它音讯并且栈为空,在这段延迟时间过来之后,音讯会被马上解决( 能看肉眼看到的统一 )。然而,如果有其它音讯,setTimeout 音讯必须期待其它音讯解决完( 所以为何 10 万级 for 循环 log 的时候,咱们会源源不断的看见被打印)。因而第二个参数仅仅示意起码延迟时间,而非确切的等待时间

正文完
 0