Javascript 为什么我的setInterval函数没有';停不下来

Javascript 为什么我的setInterval函数没有';停不下来,javascript,ajax,Javascript,Ajax,我需要用javascript编写一个setInterval函数。这是代码: var myTimer=setInterval(function(){ var time=0; $.ajax({ url:'...' type: "POST", dataType:"", success: function (response) { if(r

我需要用javascript编写一个setInterval函数。这是代码:

var myTimer=setInterval(function(){ 
        var time=0;

        $.ajax({
            url:'...'
            type: "POST",
            dataType:"",
            success: function (response) {

                if(response=="true" || time>=10000){

                    clearInterval(myTimer);
                }
                time=time+1000;


            },
            error: function () {
                alert("FAIL");
            }
        });


        },1000);

我不知道为什么它不在clearInterval停止。有人能帮我吗?

您声称代码确实“出现在“如果”中,因此我假设
clearInterval
调用实际上正在进行

考虑到这一点,最有可能的解释是间隔正在被清除(毕竟),但是在第一个
“true”
响应之前,您已经进行了多个ajax调用,您看到的其他调用是在间隔被清除之前安排的

例如,您的代码运行并:

  • 触发ajax调用#1,完成该调用需要一秒钟以上的时间
  • 发出ajax调用#2
  • Ajax调用#1已完成,但不是
    “true”
  • 发出ajax调用#3
  • Ajax调用#2完成并且
    为“true”
    ,清除了间隔
  • Ajax调用#3完成
  • 混合使用两个独立的异步间隔(一个通过
    setInterval
    和一个通过
    ajax
    )会带来麻烦

    如果目标是每秒发出一次请求并在返回时停止
    “true”
    ,我会让成功处理程序安排下一次调用,例如:

    (function() {
        var time = 0;
        var started = 0;
    
        start();
    
        function start() {
            started = Date.now();
            $.ajax({
                url: '...'
                type: "POST",
                dataType: "",
                success: function(response) {
                    if (response != "true") {
                        // Schedule the next call to occur one second after we
                        // started the previous call; or almost immediately if
                        // the call took more than a second to complete
                        setTimeout(start, Math.max(0, 1000 - (Date.now() - started)));
                    }
                    time = time + 1000;
                },
                error: function() {
                    alert("FAIL");
                }
            });
        }
    
    })();
    
    让我举例说明预期和实际情况,使事情更清楚

    情景#1

    下图显示了所有ajax请求在一秒钟内完成的情况。您会注意到ajax回调
    success
    (或
    error
    )函数只会在
    clearInterval
    之前执行(这是您一直期望的)

    场景#2

    当一些ajax请求花费的时间超过1秒时(可能会发生这种情况),ajax回调可以在
    clearInterval
    之前和之后/触发,这让您感觉到
    setInterval
    没有停止

    请注意,
    time
    变量是无用的,因为它是一个函数范围内的变量,每次函数调用时都会初始化为
    0
    。即使它是一个全局变量,它也只会清除第11个成功函数回调中的间隔,并且无法保证这11个成功请求将花费多长时间

    解决方案

    同样,最好在前一个成功回调中安排下一个ajax调用,这可以保证ajax请求按顺序发出(一次只能发出一个)

    注意:因为您在他的回答之后编辑了您的问题,所以您还需要像下面这样编辑if条件:

    success: function(response) {
        if (response != "true" && time < 10000) {
        setTimeout(start, Math.max(0, 1000 - (Date.now() - started)));
        }
    }
    
    成功:功能(响应){
    如果(响应!=“真”&&time<10000){
    setTimeout(start,Math.max(01000-(Date.now()-start));
    }
    }
    
    你有吗?很可能响应永远不等于
    “true”
    是的,它出现在没有引号的“if”“true”try true中,检查字符串“true”而不是实际的布尔值true,因为ajax请求需要超过1000毫秒,所以在清除它之前,间隔会经过很多次,可能是同一个问题