匿名javascript轮询函数不会立即触发setTimeout ajax调用

匿名javascript轮询函数不会立即触发setTimeout ajax调用,javascript,ajax,settimeout,anonymous-function,polling,Javascript,Ajax,Settimeout,Anonymous Function,Polling,我有一个匿名轮询函数,它有一个setTimeout,每30秒启动一次ajax调用。但是,匿名函数确实会立即启动,但由于某些原因,ajax调用不会立即启动,而是仅在30秒后启动。我是不是错过了一些东西,比如立即调用它以立即触发 (function poll() { console.log('polling called'); setTimeout(function () { $.ajax({ url: "/se

我有一个匿名轮询函数,它有一个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秒后开始,而不是立即开始。
谢谢

如果您正在编写一些轮询函数,则必须在上一步完成后发送请求。服务器必须在几秒钟后响应浏览器。在此期间,服务器将处理所有其他请求。下面是一个例子:

(函数轮询(){
log('pollingcalled');
$.ajax({
url:“/server/call”,
键入:“GET”,
数据类型:“json”,
超时:30000,
成功:功能(数据){
var currentdate=新日期();
var datetime=“上次同步:”+currentdate.getDate()+“/”+(currentdate.getMonth()+1)+“/”
+currentdate.getFullYear()+“@”
+currentdate.getHours()+“:”
+currentdate.getMinutes()+“:”
+currentdate.getSeconds();
console.log(datetime);
log('调用在:'+日期时间成功);
},
完成:函数(){
setTimeout(函数(){
投票()
},200)//在200毫秒内什么也不做
}
});
})();

这不是
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秒后进行

编辑:

如果您的环境中没有
常量
=>
(“胖箭头”),则您的选择是

  • 使用
    var
    功能
    。它们在许多方面都很低劣,但普遍可用
  • 使用像transpiler一样的语言,以稍微增加操作环境的复杂性为代价,获得现代语言的所有优势(常量、简单的匿名函数、解构、数组扩展)

  • 你马上就要把它安排在30秒后。如果您想让它立即运行,请不要使用
    setTimeout
    将其计划在30秒后运行。。。?也许您要做的是让
    poll
    立即拨打电话,然后将以后对
    poll
    的呼叫延迟30秒?另外,为什么您要在页面刚刚刷新后立即触发它我假设你不是通过点击事件触发的…@apsillers所以与其设置Timeout立即轮询,不如设置如何设置未来的呼叫?@JeroenBellemans加载页面,我想检测显示什么控件,这意味着是否需要启用或禁用按钮或div。因此,在页面加载时,我希望它进行检查,然后继续检查,直到状态根据ajax调用的响应发生变化。。。setTimeout就是这么做的。它会等待。但从我一直阅读的内容来看,不建议使用setInterval,因为它可以排队处理大量请求,建议的方法是使用匿名setTimeout。@Lumpy--请参见编辑。谢谢,看起来它可以完成这项工作,我只是不熟悉javascript中的关键字const,但对不可变变量()这只与作用域有关。另请注意,并非所有浏览器都支持const。@不幸的是,Lumpy不会降低答案的有效性或实用性。看起来像是在运行代码段,实际的ajax调用不会执行,因为它不会注销success中的语句。它只记录“polling called”语句。当然不是:)因为服务器不存在:)这只是一个示例来说明如何实现长轮询我的意思是,当我在我的环境中实现它时,它也不起作用。很抱歉给你带来了困惑。谢谢,好吧,那么到底是什么不起作用呢?有错误吗?如果请求不成功,您可以添加方法来检测发生了什么样的错误。对不起,这是我的错误。服务器请求出错,从未返回。您的解决方案非常有效,应该适用于所有浏览器。