2015-06-10 69 views
0

在发出警报时,它会始终发出警报jojotest2.php有文字Locojavascript全局变量不会在ajax回调中更新

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> 
+1

Bsien。我建议你阅读关于ajax的异步行为。 –

+0

好吧,我从中得到了很多有用的信息。我是JavaScript的初学者,所以帮助了很多。我想我必须用'async:false'选项来解决我目前的情况。 – Bsienn

+1

'async:false'使ajax同步,但在大多数情况下不会使用,因为它会暂停执行,直到ajax返回并且页面可能会冻结。所以放置'var toBeUsedLater = temp;'的更好的地方是在'success'回调(你在设置innerhtml的地方)或者在一些promise钩子中。 你可以阅读关于jQuery的承诺。 –

回答

4

这是一个异步功能。 (这就是AJAX中的A)。您正在立即提醒temp的值,因此它在异步调用完成之前发生。如果添加

alert(temp); 

要将success处理程序结束后,你会看到值已经更新。

1

1)变化 var temp = 'jojo' 到 “临时= '乔乔'

由于这是不束缚于执行上下文和不限于文件(具有优缺点 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

2)问题是该警报在回调之前被调用。 将警报移到功能中。由于ajax是异步调用的,意味着只有当ajax从服务器获得响应时,才会调用成功和错误函数,而现在的警报将立即被调用。

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的假异步: What does "async: false" do in jQuery.ajax()? 这将导致Ajax调用的下一行代码前将完成,但强烈建议不要要做到这一点。

+0

删除'var'并不是真正必要的,因为它不直接在任何函数中作用域,所以它自动成为全局变量,但其余答案为真。 – vinayakj

+0

@vinayakj只要你不分裂成多个文件,那么它就是真的,然后它就成为问题,这就是为什么不使用var更安全。 –

1

AJAX - asynchronous意味着您不会等待回应来,Javascript是解释语言一行接一行地执行。所以这里alert(temp)会先执行,然后执行成功回调,因为它需要一些时间来获得响应。