Ajax事件处理程序不更新变量?

时间:2012-01-12 18:51:03

标签: javascript ajax jquery callback

我遇到问题,在.click函数中声明的变量要在click函数中的Get函数中更新。我已经收集到了,即使变量具有相同的名称,在Get函数中它实际上是重新声明它。

我试图找到帮助我的例子,但在我看来,Get方法是一个专门的功能,示例似乎并不适用。

我希望使用Get函数检索的信息更新'SettingContentToEdit'的值。

以下是代码。

感谢您的帮助!

 $(".cellSetting").click(function () {
          var clickedClass = $(this).attr("class");
          var clickedItemID = $(this).attr("id")
          var SettingContentToEdit = "not changed";

          var JSONSend = {
              'ItemName': clickedItemID,  //send the item name so the model knows which one to pull up!
              'ItemSetting': clickedClass
          };




          $.get(
                        '/Home/getItem',
                         JSONSend,
                          function (data) {

                              //  $('#dialog').html(data.ItemSettings[data.SettingToEdit]);

                              SettingContentToEdit = data.ItemSettings[data.SettingToEdit];

                              alert(SettingContentToEdit); //returns the correct info

                          }
                        );

          alert(SettingContentToEdit);  //returns "not changed"

});

2 个答案:

答案 0 :(得分:0)

AJAX是异步的。如果您检查SettingContentToEdit比您正在做的晚一秒左右,您会看到该值已更新。

将代码放在get函数内(警报显示正确的值)或使请求同步(您必须查找jQuery文档,因为我不使用jQuery)

答案 1 :(得分:0)

您的问题是您的ajax调用是异常的。 {»1}}函数的成功处理程序在您的单击处理程序和alert()已完成后的某个时间调用。您可以在成功处理程序中引用局部变量,但成功处理程序之后的代码在成功处理程序之前执行。

这是因为您的get()操作是异步的。调用它只是启动网络操作然后你的javascript执行继续(当网络操作在后台工作)。启动网络操作后,将调用get()。然后,一段时间LATER,Ajax调用完成并执行成功处理程序。

这是一个非常常见的错误,确实在这里被问过并回答了数百次(如果不是数千次)SO(我个人可能已经回答了20-30次)所以你并不是唯一一个错过这种理解的人。

如果要使用ajax操作的结果,那么您需要将执行该操作的代码放在成功处理程序中,或者将其放在您从成功处理程序调用的函数中。你不能把它放在alert()函数之后,因为它会在结果知道之前过早执行。