Javascript 无法中断包含ajax调用的循环

Javascript 无法中断包含ajax调用的循环,javascript,ajax,Javascript,Ajax,我使用的是简单的ajax调用,根据调用的结果,我希望从循环中中断。它看起来像这样: while(true){ jQuery.get(url) .then(function(result){ if(result === something){ break; } }); } 这只会产生无限循环。既然这不起作用,我怎么能用其他方式实现呢

我使用的是简单的ajax调用,根据调用的结果,我希望从循环中中断。它看起来像这样:

while(true){        

   jQuery.get(url)

       .then(function(result){
            if(result === something){
                break;
            }

        });             
}
这只会产生无限循环。既然这不起作用,我怎么能用其他方式实现呢

我还注意到,修改
.then()
中的任何“外部”变量实际上并没有修改该变量,我试图使用该变量中断循环


请解释一下为什么会发生这种情况

一个选项是在函数上放置
jQuery.get
。如果结果不等于
something
变量,请再次调用该函数

函数doFunction(){
jQuery.get(url)
.然后(函数(结果){
如果(结果!==某物){
doFunction();//如果结果不是什么,请再次执行该函数
}
});
}

doFunction()//Inital执行函数
您当前没有做任何事情来否定
,while(true)
,因此是无限循环


函数中的
中断
只会中断传递给
然后
回调的函数。

简而言之,原因是
jQuery.get()
是异步的:函数不等待get请求完成,而是立即返回。因此,您的代码只是无限期地发出GET请求。“then”中的回调函数与此无关。在没有循环的情况下,您会看到相同的现象:

jQuery.get(url1).then(function () { /* A */ });
jQuery.get(url2).then(function () { /* B */ });
第二个请求在第一个请求之后立即发送,无需等待代码A执行。A和B仅在各自的请求完成后执行,因此B实际上可能在A之前执行

解决这个问题的一个方法是埃迪的答案。另一种方法是使用jQuery支持的
Promise
s和
async
/
await
语法:

// "await" may appear only within async functions, so here I wrap the code
// into an immediately invoked function for demonstration
(async function () {
    while (true) {
        // "await" is key. It makes sure that the subsequent code is executed
        // only once the request is done.
        const result = await jQuery.get(url);

        if (result === something) {
            break;
        }
    }
})();

为什么get请求被包装在一个while循环中?如果您不打算在收到响应之前中断循环,那么将其包装在while循环中会导致启动大量HTTP请求。