0

我有一些 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;
        }
    });
}
4

2 回答 2

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
于 2013-03-04T19:43:23.873 回答
-1

默认情况下,ajax 调用是异步的,成功或错误函数被推迟到 $.ajax 检索到 tmp/result1.html 之后。在您的情况下,它们将被永远推迟,因为 while 循环将保留手,$sid 将保持等于 200,并且您将继续堆积 ajax 调用。

一个快速的解决方法是让你的 ajax 调用同步:

$.ajax({
  url: "tmp/result1.html",
  async: false,
  success: function(html)
// etc.

重写代码以避免混合使用 while 循环和 ajax 可能是一个更好的主意(但我不知道您的具体上下文)。

于 2013-03-04T19:34:14.137 回答