【问题标题】:setTimeout not giving the expected outputsetTimeout 没有给出预期的输出
【发布时间】:2017-01-22 10:23:16
【问题描述】:

我有以下代码,但它似乎无法正常工作。我不明白为什么。

JS

var updateBoard = function() {
        $.ajax({
            type: "POST",
            url: "engine/main.php",
            data: {codes: 2},
            success: function(response) {
                console.log(response);
            }
        });
        setTimeout(updateBoard, 1000);
    };

PHP

if(isset($_POST['codes'])) {
    echo "test";
}

【问题讨论】:

  • 所以调用 setTimeout(updateBoard, 1000);` 在更高级别。外部函数
  • 有什么问题。你对上面的代码有什么期望?
  • @vijayP,我希望每秒在我的控制台中收到 test 这个词。但我的代码没有给出任何输出。
  • A) 你最好使用成功处理程序设置下一个超时以避免重叠请求,以防一个请求花费 >1s。B) 你必须在它开始调用自己之前调用你的函数一次(除非你只是忘记添加此代码行)
  • @Smiranin - 不;递归 setTime 和 setInterval 有很大区别。在 setInterval 的情况下;我们每 1 秒发出一次请求,但不知道先前请求的响应是否已经返回。但在 setTimeout 的情况下;仅当先前的请求已完成时,我们才会发出下一个请求。所以最终我们减少了服务器的流量。

标签: javascript php jquery settimeout


【解决方案1】:

您可以尝试以下方法:

var updateBoard = function() {
        $.ajax({
            type: "POST",
            url: "engine/main.php",
            data: {codes: 2},
            success: function(response) {
                console.log(response);
                setTimeout(updateBoard, 1000); //calling the function after 1 sec after we get the response
            }
        });

    };

updateBoard(); //calling it right away

【讨论】:

    【解决方案2】:

    正如@Smiranin 所说,只需在函数之外调用 setTimeout

    var updateBoard = function(){
        $.ajax({
            type: "POST",
            url: "engine/main.php",
            data: {codes: 2},
            success: function(response) {
               console.log(response)
            }
        })
    };
    setTimeout(updateBoard, 1000);
    

    或者只使用 setInterval 而不是 SetTimeout

    setInterval(updateBoard, 1000);
    

    【讨论】:

    • 它运行我的代码一次,导致test 仅在控制台中打印一次。
    • @Ayan 我编辑时只使用 setInterval 而不是 setTimeout 检查:jsfiddle.net/onq49tgr
    • @setInterval 也有效,但我不喜欢重叠请求问题。
    【解决方案3】:

    如果你想每秒钟运行一次,你可以尝试 setInterval()。

     var updateBoard = function() {
            $.ajax({
                type: "POST",
                url: "engine/main.php",
                data: {codes: 2},
                success: function(response) {
                    console.log(response);
                }
            });
            
        };
    	setInterval(updateBoard, 1000);
    	
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

    【讨论】:

    • 后端请求的间隔不是一个好主意。想象一下,您有一个请求需要超过 1 秒的时间(例如,有人在移动设备上使用高延迟连接)。你最终会得到一堆重叠的请求。
    猜你喜欢
    • 2018-09-18
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2019-07-16
    • 1970-01-01
    相关资源
    最近更新 更多