保持用户会话活着的问题

时间:2011-08-09 15:52:01

标签: javascript settimeout

我有一个想法是通过发送网络服务电话来保持我的用户会话活着,设置超时一段时间(比如15分钟左右)然后回想一下相同的方法。

问题是网络服务似乎不断发生。不像我想的那样每隔15分钟。

可在此处找到链接:Fiddle

代码在这里:

(function($, window, document, undefined) {
    "use strict";

    var methods, 
        settings,
        timeout,
        type = 'sessionPing';

    methods = {
        init: function () { 
            settings = { time: 5000};

            methods.request.call(this);
        },

        request: function () { 
            console.log('just before clear' + timeout);
          clearTimeout(timeout);

            $.ajax({ type: 'POST',
                   url: '/echo/html/',
                   data: {
                    'html': 'Echo!'
                   },
                   success: function(data) {
                     timeout = setTimeout(methods.request(), settings.time);  
                       console.log('in success ' + timeout);
                   },
                   dataType: 'html'
                });  
        }
    };

    $.sessionPing = function(method) {
        // Method calling logic
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.timeSince');
        }
    };

}(jQuery, window, document));


$(function() {
    $.sessionPing();
});    

5 个答案:

答案 0 :(得分:7)

timeout = setTimeout(methods.request(), settings.time);

您的括号将自动运行methods.request,而methods.request将运行自动运行timeout = setTimeout(methods.request, settings.time); 的代码。基本上,该方法将反复执行,将自身的更多版本绑定到您的间隔。

{{1}}

这就是你要找的东西:只是传递函数签名而不是传递一个作为副作用执行的函数。

答案 1 :(得分:5)

修复超时,使其调用函数:

timeout = setTimeout(function(){methods.request()}, settings.time); 

如果你不这样做,那么你 在超时中放置的功能将立即被调用。

答案 2 :(得分:2)

函数是javascript中的一阶对象。在你的ajax成功函数中你设置了一个超时:

timeout = setTimeout(methods.request(), settings.time);

但是,请注意您正在执行methods.request,而不是将该函数作为执行超时的对象传递。正确的代码应该是

timeout = setTimeout(methods.request, settings.time);

注意我已经在你的小提琴上测试了这个,这个更新解决了这个问题。

答案 3 :(得分:0)

您将超时设置为5000毫秒,这意味着它将每5秒触发一次,而不是您要查找的15分钟。

那将是900000毫秒。

答案 4 :(得分:-2)

使用setInterval代替setTimeout - 它将更易于管理并完全满足您的需求。