views:

398

answers:

4

Hi folks, In my app I am polling the webserver for messages every second and displaying them in the frontend. I use setInterval to achieve this. However as long as the user stays on that page the client keeps polling the server with requests even if there is no data. The server does give an indication when no more messages are being generated by setting a variable. I thought of using this variable to clearInterval and stop the timer but that didn't work. What else can I use in this situation? I am using jquery and django. Here is my code:

jquery:
 var refresh = setInterval(
        function ()
            {
                var toLoad = '/myMonitor'+' #content';             
                $('#content').load(toLoad).show();

            }, 1000); // refresh every 1000 milliseconds
    });

html:
div id=content is here 

I can access the django variable for completion in html with each refresh. How can I set clearInterval if at all ?

Note: stack overflow does not let me put is &gt &lt so html is incomplete

Thanks

Updated 03/16/2010 I must be doing something wrong. But cannot figure it out. Here is my script with clearTimer and it does not work.


var timer = null;
$(function(){
        if ("{{status}}" == "False")
        {
           clearInterval(timer);
        }
        else
        {
            timer = setInterval(
                function(){
                    var toLoad = '/myMonitor'+' #content';  
                    $('#content').load(toLoad).show();} 
                    ,1000); // refresh every 1000 milliseconds
        }
    });

status is a boolean set in "views.py" (Django). Thanks a bunch.

A: 

try to google "reverse ajax" and how to bind it with Python. E.g. there are simple sources of pi.comet application and one of server-side implementation is in python.

Maxym
+1  A: 

A couple people have already answered with specific resources to your problem, so I thought I would provide a bit of background.

In short, you want the server to push data to the browser to avoid extensive client-side polling. There isn't a good cross-browser way to support server push, so a common solution that requires much less polling is to use the Comet (another cleaning product, like AJAX) long-poll technique.

With Comet, the browser makes a request, and the server keeps the connection open without responding until new data is available. When the server does has new data, it sends it over the open connection and the browser receives it right away. If the connection times out, the browser opens a new one. This lets the server send data to the client as soon as it becomes available. As others have indicated, this approach requires special configuration of your web server. You need a script on the server that checks for data at an interval and responds to the client if it exists.

Something to keep in mind with this approach is that most web servers are built to get a request from a client and respond as quickly as possible; they're not intended to be kept alive for a long period of time. With Comet you'll have far more open connections than normal, probably consuming more resources than you expect.

Ryan
Thanks Ryan for this detailed explanation. Ideally I do not want a long open connection and I do not have bursty traffic like a chat session. I have continuous messages coming out for a specific period of time. Any other approach ?
spyder
A: 

There's a jquery plugin which abstracts setInterval behaviour, this plugin also gives you the possibility to name each timer instance and stop it directly or after a certain amount of repetitions.

http://plugins.jquery.com/project/timers

mamoo
Thanks, tried this but am still stuck.
spyder
A: 

Your clearInterval check is only checking when the document ready event is fired.

If the code you gave is exactly what's in the browser, then you're comparing the string "{{status}}" to the string "False". I'd rather watch paint dry than wait for that to evaluate as true.

What if your requests taking longer than 1 second to complete? : You'll flood your server with requests.

function update () {
  $('#content').show().load('/myMonitor'+' #content', function (response, status) {
    if (!/* whatever you're trying to check*/) {
      setTimeout(update, 1000);
    };
  });
};

$(document).ready(function () {
  update();
});

Is closer than where you were, but you still need to work out how you're going to decide when you want to stop polling.

Matt