我有以下代码,每5秒调用一次web服务。此webs服务检查列表中是否有任何内容。
setTimeout(function () {
_getListItems();
}, 5000);
然而,我不是每5秒检查一次,而是想在页面加载时检查它,之后每分钟检查一次。如果列表中找到了某些内容,请每隔5秒开始调用一次。任何人都可以帮我这个吗?
答案 0 :(得分:5)
即使答案已经被接受,我也会发布这个,因为AJAX和setInterval
的组合允许我正在努力取消负载均衡器并敲击所有公司网站的应用程序脱机。
首先,让我们讨论一下setInterval
和setTimeout
之间在AJAX投票方面的差异。
使用setInterval
使用setInterval
使用setTimeout
使用setTimeout
timeout + AJAX request time + response processing time
而有所不同,因此一旦考虑到AJAX请求返回的时间,超过5,000毫秒就可以给出大约5,500毫秒的时间间隔浏览器,以及浏览器处理响应。您可以通过跟踪AJAX请求和处理时间并从标准超时期间减去该数据来解决此问题。基本上,使用setTimeout
的后果是增加了代码复杂性,但是当服务器端的内容运行缓慢时,降低了自己系统的DDOS风险。
使用setTimeout
function poll(url, method, period, beforeRequest, onSuccess, onError) {
var xhr = new XMLHttpRequest(),
onReadyStateChange= function() {
if (this.readyState === 4) {
if (this.status === 200 || this.status === 201) {
onSuccess(xhr);
setTimeout(sendRequest, period);
}
else if (this.status > 399) {
// Allow error handling code to retry the operation
onError(xhr, sendRequest, period);
}
}
},
sendRequest = function() {
var data = beforeRequest(xhr) || null;
xhr.open(method, url, true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.send(data);
};
xhr.onreadystatechange = onReadyStateChange;
setTimeout(sendRequest, period);
}
并使用该功能:
poll("/messages", "POST", 10000,
function beforeRequest(xhr) {
return "?user_id=123";
},
function onSuccess(xhr) {
var data = JSON.parse(xhr.responseText);
// show messages...
},
function onError(xhr, sendRequest, period) {
if (xhr.status === 401) {
// show dialog to log in user
}
else {
// retry the operation
setTimeout(sendRequest, period + 10000);
}
}
);
答案 1 :(得分:2)
setTimeout
仅在给定的时间间隔后执行一次,你拥有/意味着setInterval
。
这些方法的返回值是标识符。使用此ID可以删除间隔。
如何执行此操作:
初步检查文件准备就绪+申请setInterval
1分钟(将变量保存在变量中)
如果每分钟调用的函数在列表中有项目,则删除1分钟间隔,设置一个每5秒检查一次的新函数
var intervalCall = window.setInterval(function() { }, 60000);
window.clearTimeout(intervalCall);
这是您的参考:https://developer.mozilla.org/en-US/docs/Web/API/Window.setInterval