匿名javascript轮询功能不会立即触发setTimeout ajax调用

时间:2017-03-28 14:37:27

标签: javascript ajax settimeout anonymous-function polling

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

2 个答案:

答案 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;),您的选择

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