2011-08-16 30 views
0

我有一个页面,客户端有时会在不刷新(超过24小时)的情况下长时间保持打开状态。该页面上的一些操作需要有效的PHP会话,因此我已经构建了一组简单的函数来每10分钟运行一次该检查。尝试执行两个函数递归时没有定义一个函数

2功能:

  1. checkLogin()
  2. refreshTimer()

我们称之为checkLogin()开始,checkLogin()调用refreshTimer()。定时器完成后,它应该调用checkLogin(),它应该调用refreshTimer()并重新开始整个过程​​。

我们第一次直接调用checkLogin()的东西效果很好。但是,当refreshTimer()尝试调用checkLogin()时,我得到checkLogin()的“未定义函数”错误。

从我的研究看来,我应该可以调用checkLogin()而不传递给refreshTimer()。

我敢肯定我可能错过了一些明显的东西。谢谢你的帮助!

function checkLogin() 
{ 
    $.ajax({ 
     url: "/mysite.com/dev/includes/check_login_helper.php", 
     success: function(logged_in) 
     { 
      if(logged_in == "false") 
      { 
       // they are logged out - redirect them to login page 
       alert("logged out"); 
      } 
     } 
    }); 
    refreshTimer(); 
} 


function refreshTimer() 
{ 
    var t = setTimeout("checkLogin()",15000); // do each 10 min currently shorter for test 
} 

//start the process up 
checkLogin(); 

固定&使用checkInterval

function checkLogin() 
{ 
    $.ajax({ 
     url: "/mysite.com/dev/includes/check_login_helper.php", 
     success: function(logged_in) 
     { 
      if(logged_in == "false") 
      { 
       // they are logged out - redirect them to login page 
       alert("logged out"); 
      } 
     } 
    }); 
} 


    setInterval(checkLogin(),15000); // do each 10 min currently shorter for test 
+2

实际上它可能是更好地使用'变种T = setInterval的(checkLogin,15000);'这里并删除调用refreshTimer –

+0

好主意,这将简化它。 – salonMonsters

回答

2

不要将字符串传递给setTimeout; it'seval in disguise。在这种情况下,也没有理由捕获由setTimeout返回的值。

function refreshTimer() 
{ 
    setTimeout(checkLogin, 15000); 
} 
+0

谢谢,这有助于解释为什么。 – salonMonsters

1
var t = setTimeout("checkLogin()",15000); 

需要是

var t = setTimeout(checkLogin,15000); 

此方法接受功能和不是字符串。

+1

这个改变如何解释行为?虽然更好,但它应该以任何方式工作。 – BrokenGlass

+4

“此方法接受函数句柄而不是字符串”在技术上是不正确的。该方法将接受一个传递给'eval()'的字符串。最好使用功能手柄,但不是必需的。 –

+0

@BrokenGlass老实说我不知道​​(虽然很喜欢学习)。我所知道的是,我总是将函数传递给setTimeout和setInterval,而不是字符串。 –

相关问题