在ajax回调函数之外使用变量

时间:2010-11-29 20:30:34

标签: javascript jquery ajax

在回调函数之外使用全局变量的最佳方法是什么?

    var icon; 
    $(function(){

      $.get('data.xml', function(xml){

           icon = xml.documentElement.getElementsByTagName("icon");
           //this outputs a value
           console.log(icon);
       });
       //this is null
       //How can this maintain the value set above?
       console.log(icon);
    });

4 个答案:

答案 0 :(得分:5)

您提供的代码完全有效 - 事实上,icon “维持”它的价值。问题可能是get()异步运行 - 只有在服务器上完全加载 'data.xml'之后才调用匿名函数。所以现实世界的执行顺序看起来像这样:

  1. call get('data.xml', function(xml){...})(开始加载data.xml)
  2. 致电console.log(icon)(此时icon仍为空)
  3. (data.xml已完成加载)现在调用匿名函数,该函数将值赋给icon:icon = xml.documentElement.getElementsByTagName("icon")
  4. 如果您希望在之后使用icon的值执行某些操作,那么您需要执行内部 / em>匿名回调函数。像这样:

    var icon; 
    $(function(){
    
      $.get('data.xml', function(xml){
           icon = xml.documentElement.getElementsByTagName("icon");
           console.log(icon);
       });
    });
    
    祝你好运!


    注意:您仍然可以使用来自外部匿名函数的代码中的icon,但您需要等待访问它,直到之后匿名函数已经运行。执行此操作的最佳方法是将相关代码放入其自己的函数中,然后在回调函数中调用该函数:

    var icon; 
    $(function(){
    
      $.get('data.xml', function(xml){
           icon = xml.documentElement.getElementsByTagName("icon");
           loadIcon();
       });
    
       function loadIcon() {
           console.log(icon);
           // ... do whatever you need to do with icon here
       }
    });
    

答案 1 :(得分:1)

当你正在进行异步ajax时,

console.log(icon);将没有值。移动处理回调函数中的响应的整个代码或它调用的函数。

$(function(){

  $.get('data.xml', function(xml) {
       var icon = xml.documentElement.getElementsByTagName("icon");
       console.log(icon);
   });
});

答案 2 :(得分:1)

问题是$.get正在排队请求,但不会同步执行请求;它会立即返回。 JavaScript不是多线程的!

您必须在回调函数中执行console.log(icon) 。在执行该行时,AJAX调用尚未完成。

将从回调中设置全局icon变量 ;你的代码在这方面是正确的。

答案 3 :(得分:1)

这样可以帮助可视化代码。

    var icon; 
    $(function(){
        $.get('data.xml', callback); // sends ajax request
        // next line happens immediately unless ajax request is set to synchronous
        console.log(icon); // logs undefined
    });
    function callback(xml){ // onsuccess callback happens
        icon = xml.documentElement.getElementsByTagName("icon");
        console.log(icon); // logs Array
    }

我删除了匿名函数,并在console.log之后放置了回调。像其他人一样指出ajax回调是异步发生的,而javascript继续执行。