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

Ajax event handler does not update variables?

本文关键字:更新 变量 程序 事件处理 Ajax      更新时间:2023-09-26

我在获取在.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"
});

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

这是因为get()操作是异步的。调用它只会启动网络操作,然后继续执行javascript(而网络操作在后台工作)。启动网络操作后,会调用您的alert()。然后,稍后,Ajax调用完成,并执行成功处理程序。

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

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

AJAX是异步的。如果你比现在晚一秒钟左右检查SettingContentToEdit,你会看到值已经更新。

要么将代码放入get函数中(在这里您可以看到显示正确值的警报),要么使请求同步(您必须查找jQuery文档,因为我不使用jQuery)。