无法改变变量

时间:2013-03-04 19:21:41

标签: javascript jquery

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

2 个答案:

答案 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可能是一个更好的主意(但我不知道你的特定上下文)。