我有一个想法是通过发送网络服务电话来保持我的用户会话活着,设置超时一段时间(比如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();
});
答案 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
- 它将更易于管理并完全满足您的需求。