Node.js中为何无法使用clearInterval(this)清除定时器?
为什么
clearInterval(this)无法清除定时器? 这事儿得从setInterval和clearInterval的工作逻辑说起:
setInterval执行后会返回一个唯一的数字ID,这个ID就是定时器的“身份证”——clearInterval必须拿到这个ID,才能找到对应的定时器并把它关掉。
先看你的可行代码:
var test = setInterval(function(){ request.post({url: myURL, form: { user : myUser, pass : myPass }}, function(err,res,body){ if(res.statusCode === 302) clearInterval(test); }) }, 1100)
这里test变量存的就是setInterval返回的那个ID,所以在request的回调里调用clearInterval(test),相当于精准告诉它“把ID是test的那个定时器停掉”,自然能生效。
再看你的不可行代码:
setInterval(function(){ var that = this; request.post({url: myURL, form: { user : myUser, pass : myPass }}, function(err,res,body){ // 尝试使用clearInterval(that)无效 }) }, 1100)
问题出在this(也就是你存的that)的指向!在普通函数作为setInterval的回调时,非严格模式下this指向的是全局对象(浏览器里是window,Node.js环境里是global),根本不是setInterval返回的那个定时器ID。你给clearInterval传一个全局对象,它完全不知道你要关哪个定时器,当然就无效了。
补充小提示
如果不想用外部变量test,你可以把ID存在某个可访问的地方(比如一个对象的属性里),但核心逻辑不变:必须把setInterval返回的那个ID传给clearInterval才能生效,传其他任何值都不行。
内容的提问来源于stack exchange,提问作者Manpreet Krishan
相关产品推荐
相关产品推荐

