Javascript 停止循环函数设置超时

Javascript 停止循环函数设置超时,javascript,loops,settimeout,Javascript,Loops,Settimeout,我有一个使用setTimeout的循环,如下所示: <button onclick="clickStop()">stop</button> <script type="text/javascript"> let i = 0; let sett; function timeOut(counter) { sett = setTimeout(function () { $.get("./test

我有一个使用setTimeout的循环,如下所示:

<button onclick="clickStop()">stop</button>

<script type="text/javascript">
    let i = 0;
    let sett;
    function timeOut(counter) {   
        sett = setTimeout(function () {
            $.get("./test3.php", {data_id: counter}, (data) => {
                console.log(data);
                i++;
                timeOut(i);
            });
        }, 1000);
        if(counter >= 10) {
            clearTimeout(sett);
            alert("Done!");
        }
    }
    timeOut(i);
    function clickStop() {
        clearTimeout(sett);
    }
</script>
停止
设i=0;
让塞特;
函数超时(计数器){
sett=setTimeout(函数(){
$.get(“./test3.php”,{data\u id:counter},(data)=>{
控制台日志(数据);
i++;
超时(i);
});
}, 1000);
如果(计数器>=10){
清除超时(sett);
警报(“完成!”);
}
}
超时(i);
函数clickStop(){
清除超时(sett);
}

但当我点击“停止”按钮时,它不起作用,帮帮我

您的JS似乎工作正常,请参见下文,当我单击“停止”按钮时,计数器将递增并停止。问题在于
$.get(“./test3.php”…

您能否详细说明ajax调用的预期响应是什么

另外,如果您可以描述您正在尝试做什么,我们可以给您一些关于最佳实践的建议,因为正如那些评论的人所说,在循环中运行XHR/ajax调用通常不是一个好主意

停止
设i=0;
让塞特;
函数超时(计数器){
sett=setTimeout(函数(){
超时(计数器+1);
控制台日志(计数器);
}, 1000);
如果(计数器>=10){
清除超时(sett);
警报(“完成!”);
}
}
超时(i);
函数clickStop(){
清除超时(sett);
}

您可以清除超时,还可以设置一个标志,该标志将在
$中提醒回调。获取
当回调返回时,它不应调用
timeout()

设i=0;
让塞特;
让active=true//循环是否应继续?
函数超时(计数器){
如果(计数器<10){
sett=setTimeout(函数(){
$.get(“./test3.php”,{data\u id:counter},(data)=>{
控制台日志(数据);
i++;
如果(活动)超时(i);//仅当活动时
});
}, 1000);
}否则{
警报(“完成!”);
}
}
超时(i);
函数clickStop(){
活动=假//停止循环
clearTimeout(sett);//并清除当前超时
}
您在
$中拥有的
超时(i)
。get
响应处理程序将重新启动循环,即使您停止了它。 您可以使用一个标志来控制它

设i=0;
让塞特;
让status=true;
让url=”http://placekitten.com/200/300";
函数超时(计数器){
sett=setTimeout(函数(){
$.get(url,(数据)=>{
控制台日志(i);
i++;
//如果状态标志为true,则重复此操作
如果(状态)超时(i);
});
}, 1000);
如果(计数器>=10){
清除超时(sett);
status=false;//将status标志设置为false
警报(“完成!”);
}
}
函数clickStop(){
清除超时(sett);
status=false;//将status标志设置为false
}
超时(i);
停止

是什么让你认为它不起作用的?我正在尝试,但它不起作用../test3.php需要2~3秒才能返回结果。当我在../test3过程中按stop时,它将不起作用。当你说它不起作用时,请说清楚。什么不起作用?这将非常脆弱,因为如果你在测试之前取消超时
$.get
返回,回调将在它
$时再次启动。get
调用回调。也许你可以让
单击停止
设置一个在
$调用函数之前选中的标志。get
调用函数。因此,只需一个提示,通常不应在循环中进行XHR调用。它可能会变得昂贵,或者不好。get(“/test3.php”…
返回结果大约需要2~3秒。单击“停止”或最后一次XHR调用完成后,如何停止?