2010-05-28 79 views
2

我想调用showUpload();从两个setTimeouts内。两者都不起作用。这似乎超出了范围,我不知道为什么。我试过this.showUpload()也没有工作。javascript setTimeout函数超出范围

$(document).ready(function(){ 
      var progress_key = $('#progress_key').val(); 

      // this sets up the progress bar 
      $('#uploadform').submit(function() { 
       setTimeout("showUpload()",1500); 
       $("#progressbar").progressbar({ value:0}).fadeIn(); 
      }); 


      // uses ajax to poll the uploadprogress.php page with the id 
      // deserializes the json string, and computes the percentage (integer) 
      // update the jQuery progress bar 
      // sets a timer for the next poll in 750ms 
      function showUpload() { 
       $.get("/myid/videos/uploadprogress/" + progress_key, function(data) { 
        if (!data) 
         return; 

        var response; 
        eval ("response = " + data); 

        if (!response) 
         return; 

        var percentage = Math.floor(100 * parseInt(response['bytes_uploaded'])/parseInt(response['bytes_total'])); 
        $("#progressbar").progressbar({ value:percentage}) 

       }); 
       setTimeout("showUpload()", 750); 
      } 
     }); 

谢谢你的时间。

回答

2

正如@Daniel说,这应该工作:

setTimeout(showUpload, 750); 

请注意,报价应删除(这是为什么它没有被执行,直到超时结束)。现在,您正在传递一个字符串,即在超时结束时编辑eval。这eval将发生在不同的范围,这就是为什么你看到你所看到的问题。

取而代之的是,将对showUpload函数的引用传递给setTimeout将允许稍后执行您的函数。请记住,它在运行时会处于不同的范围,因此您可能会遇到其他范围问题,例如progress_key。您需要围绕showUpload创建一个闭包来捕获该参数。

2

它看起来像你需要在setTimeout调用中删除showUpload的括号。否则你将被调用showUpload方法,而不是把它当作一个参数:

setTimeout(showUpload, 750); 
+0

意图是对的,尽管描述有点偏离,但您正在使用括号调用方法,但是您尝试在全局空间中调用一个方法时,它是一个字符串......它不会“不存在,像你这样的直接引用是正确的方法。 – 2010-05-28 00:41:28

+0

@Nick:谢谢你的提示......我只是想找一些关于'setTimeout()'作为字符串传递时代码的参考。 – 2010-05-28 00:50:47

+0

谢谢。它现在有效。 – Keyo 2010-05-28 00:50:54