【问题标题】:javascript global variable not updating in ajax callbackjavascript全局变量未在ajax回调中更新
【发布时间】:2015-06-10 16:45:12
【问题描述】:

处于警报状态时,它总是提醒jojotest2.php 有文字Loco

div 更新为Loco,但全局变量没有改变。我试过window.temp = data,但没用。

如何获取变量的返回值?请指导...

<div>
yolo
</div>

<script type="text/javascript">
    var temp = 'jojo';

        $.ajax({
            url: 'test2.php', //Loco
            success: function(data)
            {
                    temp = data;
                    $('div').html(data);
            },
            error: function (err)
             {
                 alert('error');
             }
        });

       alert(temp);
       var toBeUsedLater = temp; //updated temp value from ajax call
       refreshTab();
</script>

【问题讨论】:

  • 比西恩。我建议你阅读 ajax 的异步行为。
  • 好的,我从中得到了很多有用的信息。我是 javascript 的初学者,所以它有很大帮助。对于我目前的情况,我想我必须选择async: false 选项。
  • async: false 使 ajax 同步,但在大多数情况下不使用它,因为它会暂停执行,直到 ajax 返回并且页面可能会冻结。因此,放置var toBeUsedLater = temp; 的更好的位置是在success 回调(您正在设置innerhtml 的地方)或一些承诺挂钩中。您可以阅读有关 jquery 承诺的信息。

标签: javascript jquery ajax


【解决方案1】:

这是一个异步函数。 (这就是 AJAX 中的 A 所代表的含义。)您正在立即提醒 temp 的值,因此它发生在异步调用完成之前。如果你添加

alert(temp);

到您的 success 处理程序的末尾,您将看到值已更新。

【讨论】:

    【解决方案2】:

    AJAX - asynchronous 表示您不等待响应的到来,而 Javascript 是解释性语言,一行一行地执行。所以这里会先执行alert(temp),然后是成功回调,因为它需要一些时间才能得到响应。

    【讨论】:

      【解决方案3】:

      1) 改变 var temp = 'jojo' 到 'temp ='jojo'

      因为这与执行上下文无关,也不限于文件(有优点和缺点 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

      2) 问题是在回调之前调用了警报。 将警报移动到函数中。由于 ajax 是异步调用的,也就是说成功和错误函数被调用,只有当 ajax 得到服务器返回的响应时,你现在的 alert 才会被立即调用。

      http://javascript.about.com/od/ajax/a/ajaxasyn.htm

       $.ajax({
                  url: 'test2.php', //Loco
                  success: function(data)
                  {
                          temp = data;
                          $('div').html(data);
                          alert(temp).
                  },
                  error: function (err)
                   {
                       alert('error');
      
                   }
              });
      

      3) 或者,您可以将 ajax 的异步设置为 false: What does "async: false" do in jQuery.ajax()? 这将导致 Ajax 调用将在下一行代码之前完成,但强烈建议不要这样做。

      【讨论】:

      • 删除var 并不是真正必要的,因为它没有直接作用于任何函数,所以它会自动成为全局变量,但你的答案是正确的。
      • @vinayakj 这是真的,只要你不拆分成多个文件,它就会变成问题,这就是为什么不使用 var 更安全。
      【解决方案4】:

      只需在您的 ajax 选项中添加 async: false

      【讨论】:

      • 嗨,感谢您的意见,我当时是菜鸟,不知道异步调用的概念。您没有提供任何关于添加该代码及其对应用程序产生什么影响的结论性信息。这有副作用,需要注意。也有弃用,文档可以更多地关注它。上面的答案已经有了很好的信息,对我有好处的是了解 ajax & async 行为的工作原理,这帮助了我很长的路要走。干杯。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多