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