Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

我现在想单独创建一个js分类了。。。
咳咳,我们先来说间歇调用和超时调用的区别。间歇调用就是设置之后会会持续不断的触发超时,每次超时调用一次; 而超时调用是设置之后只会在第一次超时的时候调用。

超时调用

以下代码是超时调用:

1
2
3
4
5
6
// 定义超时后要调用的函数
function sayTimeOut(){
console.log("Time Out!!");
}
// 设置超时调用。第一个参数是要调用的函数,第二个参数是间隔的时间
setTimeout(sayTimeOut, 1000);

运行这段代码,我的Console(控制台)输出了以下内容:

1
Time Out!!

取消超时调用

如果想要在超时之前取消掉这个调用,可以使用clearTimeout函数,下面是示例代码:

1
2
3
4
5
6
7
function sayTimeOut(){
console.log("Time Out!!");
}
// setTimeout会返回一个id,这个id代表了该超时调用
var timerId = setTimeout(sayTimeOut, 1000);
// 取消超时调用
window.clearTimeout(timerId);

运行这段代码,我的Console(控制台)什么也没有输出,这很正常,因为我的机器还没有弱到一秒种只能执行一条js语句。只有在这个超时调用被调用前可以使用clearTimeout()函数,道理也十分简单: 都调用完了再取消调用也没用了。

间歇调用

先看代码:

1
2
3
4
5
6
// 定义间歇调用要调用的函数
function sayTimeOut(){
console.log("Time Out!!");
}
// 启动间歇调用
setInterval(sayTimeOut, 1000);

这段代码会导致Console(控制台)每隔1秒输出一次”Time Out!!”。

取消间歇调用

取消间歇调用的方法和关掉超时调用的方法类似:

1
2
3
4
5
6
7
function sayTimeOut(){
console.log("Time Out!!");
}
// timerId为该间歇调用的id
var timerId = setInterval(sayTimeOut, 1000);
// 取消间歇调用
window.clearTimeout(timerId);

红宝书上说,建议使用超时调用来代替间歇调用,因为超时调用会在前一个超时调用执行完之后执行,但是间歇调用不会,所以使用间歇调用可能会出现前一个间歇调用还在执行中,后一个间歇调用已经开始执行了的情况。
替代方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function TimeOutTest(){
};
TimeOutTest.prototype.num = 0;
TimeOutTest.prototype.maxNum = 10;
TimeOutTest.prototype.startCount = function(){
TimeOutTest.prototype.num++;
if(that.num < that.maxNum)
{
console.log(that.num);
// 把当前执行环境传入函数。要不然超时调用的函数的执行环境会是window
setTimeout(this.startCount.bind(this), 1000);
}
else
{
console.log("Done");
}
}
var tot = new TimeOutTest();
tot.startCount();

Console(控制台)输出如下:

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
Done

本篇完。

评论



愿火焰指引你