我有一个匿名轮询功能,它有一个setTimeout来每隔30秒启动一次ajax调用。但是,匿名函数会立即启动但由于某种原因,ajax调用不会立即启动,而是仅在30秒后启动。我错过了立即触发立即触发的东西吗?
(function poll() {
console.log('polling called');
setTimeout(function () {
$.ajax({
url: "/server/call",
type: 'GET',
dataType: "json",
timeout: 30000,
success: function (data) {
var currentdate = new Date();
var datetime = "Last Sync: " + currentdate.getDate() + "/" + (currentdate.getMonth() + 1) + "/"
+ currentdate.getFullYear() + " @ "
+ currentdate.getHours() + ":"
+ currentdate.getMinutes() + ":"
+ currentdate.getSeconds();
console.log(datetime);
console.log('call was successful at: ' + datetime);
}
});
},
30000);
})();
日志记录仅在30秒后开始,而不是立即开始。 感谢
答案 0 :(得分:1)
如果您正在编写一些轮询功能,则必须在上一次完成后发送请求。服务器必须在几秒钟后响应浏览器。在这个时间服务器处理所有其他请求。这是一个例子:
(function poll() {
console.log('polling called');
$.ajax({
url: "/server/call",
type: 'GET',
dataType: "json",
timeout: 30000,
success: function (data) {
var currentdate = new Date();
var datetime = "Last Sync: " + currentdate.getDate() + "/" + (currentdate.getMonth() + 1) + "/"
+ currentdate.getFullYear() + " @ "
+ currentdate.getHours() + ":"
+ currentdate.getMinutes() + ":"
+ currentdate.getSeconds();
console.log(datetime);
console.log('call was successful at: ' + datetime);
},
complete: function () {
setTimeout(function () {
poll()
}, 200) //do nothing 200ms
}
});
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 1 :(得分:0)
这不是setTimeout()
所做的远程。 setTimeout()
仅在给定时间到期后调用其函数。
setInterval()
接近你想要的,但即便只是在间隔过期后第一次调用该函数。
您需要做的是:
const everyThree = () =>
$.ajax({
url: "/server/call",
type: 'GET',
...
everyThree();
setInterval(everyThree, 3000);
如果您不想使用setInterval()
,您可以手动执行相同操作:
const everyThree = () => {
setTimeout(everyThree, 3000);
$.ajax({
url: "/server/call",
type: 'GET',
...
everyThree();
如果您怀疑AJAX调用可能会运行很长时间,您可以执行以下操作:
const everyThree = () =>
$.ajax({
url: "/server/call",
type: 'GET',
...
})
.always(() => setTimeout(everyThree, 3000));
everyThree();
这将在上一次成功,失败或超时后3秒进行下一次AJAX调用。
修改强>
如果您的环境中没有const
或=>
(&#34;胖箭&#34;),您的选择
var
和function
合作。它们在很多方面都很差,但是普遍可用。