一. 应用背景:
今天改bug的时候,在react的组件中遇到这样的一段代码,本来设置5秒发一次请求,但实际上发请求的速度并不是设置的那样,甚至达到了几毫秒发一次请求。
pollData (stack) {
if (this.hasTaskProcess(stack.status)) {
pollTimeout = setTimeout(()=>(this.onInit(stack._id)), 5000)
} else {
pollTimeout && clearTimeout(pollTimeout)
}
}
onInit (stackId) {
superagent
.get(API_PREFIX + `/stack-definitions/status/${stackId}`)
.use(noCache)
.end((err, res) => {
if (err) {
throw err
}
this.pollData(res.body)
})
}
二. 分析过程
开始时,考虑的方向的javaScript 和react 的异步问题所导致的,将所有的异步代码改为同步的代码后,发现并没有什么用。。。。接着,因为代码是在react的里面写的,又开始考虑是react的生命周期导致的,因为在组件中使用react的两个生命周期函数,componentDidMount和componentDidUpdate,componentDidMount是肯定不会导致此问题的,但componentDidUpdate就有可能了,注释掉componentDidUpdate的代码,发现还是没有什么用的,这证明了和react并没有多大的联系。。。最后和小伙伴pair,两个人折腾了一个多小时,无解。。。最终老师告诉了我们答案,使用箭头函数把this.onInit(stack._id)
包起来就好了,竟是这样。。。
三. 总结
- 在使用函数名作为调用句柄时都不能带参数。
function show(){
alert("Hello World");
}
setTimeout(show,1000);
这段代码的效果是在1秒后显示hello world,但是如果改成 setTimeOut(show(),1000);
就会立即显示,达不到延时的效果了。但是如果加上引号就可以了。如: setTimeOut("show()",1000);
就可以了。但是如果带上参数的话,还是不行比如: setTimeOut("show(name)",1000)
- 带参数如何传值
- 匿名函数
function show(name) {
alert("Hello World:" + name);
}
setTimeout(()=>{ show(name)},1000);
- 定义返回无参函数的函数
function show(name)
{alert("Hello World:" + name);}
function _show(name)
{
return function()
{
show(name);
}
}
setTimeout(_show(name),1000);
- 将参数写死为字符串,直接调用
setTimeout("fun1('parameters')", 100);