美文网首页
setTimeout那些你不知道的事(8.3)

setTimeout那些你不知道的事(8.3)

作者: 星期六1111 | 来源:发表于2017-08-03 21:41 被阅读36次
    一. 应用背景:

    今天改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)包起来就好了,竟是这样。。。

    三. 总结

    1. 在使用函数名作为调用句柄时都不能带参数。
    function show(){      
        alert("Hello World");  
    }  
    setTimeout(show,1000);  
    

    这段代码的效果是在1秒后显示hello world,但是如果改成 setTimeOut(show(),1000); 就会立即显示,达不到延时的效果了。但是如果加上引号就可以了。如: setTimeOut("show()",1000); 就可以了。但是如果带上参数的话,还是不行比如: setTimeOut("show(name)",1000)

    1. 带参数如何传值
    • 匿名函数
    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);
    

    相关文章

      网友评论

          本文标题:setTimeout那些你不知道的事(8.3)

          本文链接:https://www.haomeiwen.com/subject/qvcmlxtx.html