匿名 javascript 轮询函数不会立即触发 setTimeout ajax 调用
Anonymous javascript polling function does not trigger setTimeout ajax call immediately
我有一个匿名轮询函数,它有一个 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 秒后才开始,而不是立即开始。
谢谢
如果您正在编写一些轮询函数,则必须在上一个完成后发送请求。服务器必须在几秒钟后响应浏览器。在此期间服务器处理所有其他请求。这是示例:
(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>
这与 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();
这将使下一个 AJAX 调用在上一个调用成功、失败或超时后 3 秒。
编辑:
如果您的环境中没有 const
或 =>
("fat-arrow"),您的选择是
- 凑合
var
和 function
。它们在很多方面都较差,但普遍可用。
- 使用像 Babel 这样的转译器并获得现代语言的所有优点(常量、简单的匿名函数、解构、数组扩展),代价是操作环境的复杂性略有增加.
我有一个匿名轮询函数,它有一个 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 秒后才开始,而不是立即开始。 谢谢
如果您正在编写一些轮询函数,则必须在上一个完成后发送请求。服务器必须在几秒钟后响应浏览器。在此期间服务器处理所有其他请求。这是示例:
(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>
这与 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();
这将使下一个 AJAX 调用在上一个调用成功、失败或超时后 3 秒。
编辑:
如果您的环境中没有 const
或 =>
("fat-arrow"),您的选择是
- 凑合
var
和function
。它们在很多方面都较差,但普遍可用。 - 使用像 Babel 这样的转译器并获得现代语言的所有优点(常量、简单的匿名函数、解构、数组扩展),代价是操作环境的复杂性略有增加.