梦入琼楼寒有月,行过石树冻无烟

JavaScript 异步函数类型

JavaScript环境主要有setTimeoutsetInterval异步函数集,而JavaScript主要分为两种类型,分别为:“I/O函数”“计时函数”两大类

I/O 函数

JavaScript脚本语言主要采用了非阻塞式的I/O,相比其他开发语言很容易造成阻塞,相比之下可以明显的看到JavaScript只需要加入一个返回事件队列(回调)即可解决阻塞的问题。

1
2
3
4
5
6
var ajaxRequest = new XMLHttpRequest;
ajaxRequest.open('GET', url);
ajaxRequest.send(null);
while (ajaxRequest.readyState === XMLHttpRequest.UNSENT) {
// code
};

在以上code之中,这种堵塞会将永远的循环运行下去,不可能会停止。

1
2
3
4
5
6
var ajaxRequest = new XMLHttpRequest;
ajaxRequest.open('GET',url);
ajaxRequest.send(null);
ajaxRequest.onreadystatechange = function() {
// code
};

此时只需要在加上一个事件处理器,即可返回事件队列从而不会造成上述堵塞问题。

计时函数

著名的时间事件主要涉及了两个函数,分别为setTimeoutsetInterval两个函数,但是这两个函数都有自己的权限,比如上一章讲的“无法准时显示,但会维持在那个数值范围之内而不超过”。

setTimeout()

setTimeout()函数是在JavaScript异步加载中常见的异步加载函数,例子如下:

1
2
3
4
5
6
7
8
<script>
for (var one = 1; one <= 3; one++) {
setTimeout (function() {
document.write(one,"<br>");
},3000); /*三秒后输出语句*/
};
</script>
<p id="data()"></p>

只所以最后输出结果为“4.4.4”是因为这里的延时为3秒,定义的函数都会抢着要第一个触发

setInterval()

1
2
3
setInterval(function() {
console.log("Hello");
}, 3000);

原因

英特尔 i7处理器

国外开发人员发现当使用setInterval函数调度事件的时候,且延迟设置为0毫秒,则会尽可能的循环此事件。当使用英特尔i7处理器的计算机中,使用谷歌、火狐等浏览器,大约为200次/秒。但是在node环境下,此事件触发频率大约可达到1000次.秒
而将setInterval函数替换成while循环语句,则在谷歌、火狐等浏览器事件的触发频率高达400万次/秒,在Node环境之中则会达到500万次/秒。

结论

最后的出结论,setTimeoutsetInterval设计时就是想成为慢慢吞吞的,这是一个HTML规范,所有的主要浏览器都要遵守的规范,在推行的延时、时隔的最小值就是4毫秒。

⬅️ Go back