我有一些JavaScript代码(如下)。 在每种情况下,在循环结束时,$ sid应为零,但“alert($ sid)”总是给我200.我在代码中找不到错误。你能帮我吗?
提前致谢。
$sid = 200;
$canAppend = 0;
$iPage = 1;
while ($sid && $canAppend==0 && $iPage==1) {
alert($sid);
$.ajax({
url: "tmp/result1.html",
success: function(html)
{
if(html)
{
$("#inzeraty").append(html);
$('div#loadmoreajaxloader').hide();
$sid = 0;
}
},
error: function()
{
$sid = 0;
}
});
}
答案 0 :(得分:2)
问题是ajax调用是异步的。 JavaScript将此请求发送到服务器,然后继续执行下一行代码。在JavaScript完成while循环的执行之后才会调用您的成功和错误回调函数。
此外,代码的结构根本没有任何意义(对不起,不要试图粗鲁)。不使用或更改$ canAppend和$ iPage变量。这段代码将做的是进入循环并永不退出。为什么是这样?这是因为对$ .ajax()的调用是非阻塞的。在请求完成之前,它不会在那里等待,它将继续。由于JavaScript(基本上)是单线程的,因此在当前执行过程完成之前,不能执行错误和成功的回调。因为无法运行成功和错误处理程序,所以无法设置$ sid。因为无法发送$ sid,所以代码无法退出while循环。
我没看到你的代码实际上是如何使用while循环的。相反,只需调用$ .ajax()函数并在成功处理程序中处理结果。试试这个尺寸,以帮助您更好地了解正在发生的事情:
$sid = 200;
alert("$sid is 200: " + $sid); // you'll see this first
$.ajax({
url: "tmp/result1.html",
success: function(html)
{
if(html)
{
$("#inzeraty").append(html);
$('div#loadmoreajaxloader').hide();
$sid = 0;
alert("$sid is now 0: " + $sid); // you'll see this third if html is not false
} else {
alert("$sid is STILL 200: " + $sid); // you'll see this third if html is false
}
},
error: function()
{
$sid = 0;
alert("you got an error, but $sid is now 0: " + $sid); // you'll see this third if there's an error
}
});
alert("$sid is still 200: " + $sid); // you'll see this second
答案 1 :(得分:-1)
默认情况下,ajax调用是异步的,成功或错误函数被推迟到$ .ajax检索到tmp / result1.html之后。在你的情况下,他们将被永远推迟,因为while循环将保持手,$ sid将保持等于200并且你将继续堆积ajax调用。
快速解决方法是让您的ajax调用同步:
$.ajax({
url: "tmp/result1.html",
async: false,
success: function(html)
// etc.
重写代码以避免混合使用while循环和ajax可能是一个更好的主意(但我不知道你的特定上下文)。