匿名 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"),您的选择是

  1. 凑合 varfunction。它们在很多方面都较差,但普遍可用。
  2. 使用像 Babel 这样的转译器并获得现代语言的所有优点(常量、简单的匿名函数、解构、数组扩展),代价是操作环境的复杂性略有增加.