2013-04-17 67 views
3

有一个页面,我希望定期发出“背景”ajax请求。因此,页面被加载,然后它应该在一定的时间内发送Ajax请求。定期发送ajax请求

我可能会使用cron。我从来没有使用过,所以我想知道它是否适合这项任务。还有其他更简单的方法吗?

P.S.时间延迟将约为5分钟。

回答

6

由于在发送AJAX请求的时间与收到完整响应的时间之间基本上存在未知延迟,通常更优雅的方法是在固定时间后启动下一个AJAX调用前一个完成。这样,您还可以确保您的呼叫不重叠。

var set_delay = 5000, 
    callout = function() { 
     $.ajax({ 
      /* blah */ 
     }) 
     .done(function (response) { 
      // update the page 
     }) 
     .always(function() { 
      setTimeout(callout, set_delay); 
     }); 
    }; 

// initial call 
callout(); 
+0

我在哪里放置更新页面部分的代码?像'$('#my_id')。text(“data is”+ data.result);' –

+0

您可以将它放在对AJAX的'.done()'回调中,就像您通常一样。 –

+0

oo,你来自菲律宾的男人。我会在几天后在那里! –

4

cron是在服务器端运行,使用的是HTML和AJAX,所以你应该解决的Javascript这个问题:-)

使用类似setInterval你可以继续执行一个功能,你的情况可能是这样就像投票通过AJAX的URL:

function updatePage(){ 
    // perform AJAX request 
} 
setInterval(updatePage, 5000); 
+1

'的setInterval(updatePage,5000);' – stecb

+0

阐述@ stecb的评论,做你最好永远不要使用'eval'的setInterval的''版本()ANS'的setTimeout ()'。直接使用函数,直接引用或直接使用lambda。 –

+0

你们是对的,我已经更新了答案。 – Bitterzoet

1

根据您的轨道版本你可以使用periodically_call_remote,否则你会需要一个@Bitterzoet描述了jQuery选择。

更多信息in this question

1

您可以通过四个第二个发送Ajax请求是这样的:

setInterval(get_news, 4000); 
     function get_news(){ 
      $.ajax('/dashboards/get_news', { 
       type: 'POST', 
       success: function(result) { 
        if(result > 0){ 
         $('#div_1').text("See "+result+" new messages"); 
         $('#div_1').show(); 
        } 
        else{ 
         $('#div_1').css('display', 'none'); 
        } 
        }, 
       error: function() { 
        // alert("Error") 
       } 
      });  

     } 
1

你使用jQuery?如果是这样,你可以实现此方法:

// first, you need asing a callback timer 
var timeout = 300; //milliseconds 

// this method contain your ajax request 
function ajaxRequest() { //function to ajax request 
    $.ajax({ 
     url: "/url/to/request/" 
    }).done(function(data) { 
     alert("response is: " + data); 
    }); 
} 


$(document).on("ready", function(){ 

    //this method will be called every 300 milliseconds 
    setInterval(ajaxRequest, timeout); 
});