【问题标题】:How to make a javascript variable global when called the $.get method? [duplicate]调用 $.get 方法时如何使 javascript 变量成为全局变量? [复制]
【发布时间】:2012-08-01 17:40:52
【问题描述】:

可能重复:
How can I get jQuery to perform a synchronous, rather than asynchronous, AJAX request?
Get a variable after ajax done

以下代码中的两个警报函数返回不同的结果。我也试图让第二个评估真实。任何帮助表示赞赏..谢谢..

var array;

  $.get('php/getstocklist.php', function(data){  

  array = data; 
  alert($.isArray(array));    //alerts true

  }, "json");

alert($.isArray(array));      //alerts false

【问题讨论】:

  • 欢迎来到 async 的精彩世界!你不能那样做。
  • 虽然技术上正确,但该评论并没有真正的帮助。您可能应该多解释一下为什么它不能按他期望的方式工作。
  • 也许还有另一个答案,但我不明白你想要完成什么。什么是假设是警报。一个是假的,另一个不是。
  • @Elliott — 回调函数内部的那个分配了data。最后一行在 HTTP 响应返回之前执行,所以仍然是 undefined
  • 你是不是想看看 $get 是否已经被第二个警报执行了?

标签: javascript jquery arrays scope


【解决方案1】:

问题在于$.get 是异步的。 var 是全局的,就像你现在拥有的一样。它只是没有定义,因为您的第二个警报在 ajax 返回并运行其成功回调之前立即运行。

为了在回调之外使用它,您需要轮询一个变量以确保已分配结果...但是您实际上是在使用假回调,因此重组代码并执行以下操作更有意义这是正常的方式:-)

【讨论】:

    【解决方案2】:

    这是发生了什么:

    // This variable _is_ global. However, it's current value is undefined
    var array;
    
    $.get('php/getstocklist.php', function(data){  
    
      // After this runs, _now_ array has data in it
      array = data; 
    
      // thus causing $.isArray to return true here.
      alert($.isArray(array));    //alerts true
    
    }, "json");
    
    // This call happens BEFORE the callback to the $.get call,
    // so as of this line, array is still undefined, which results in 
    // the $.isArray call returning false.
    alert($.isArray(array));      //alerts false
    

    Javascript 是一种重度异步语言。您必须摆脱过程思维,转而考虑传递一些代码以便稍后执行(那些是回调)。

    【讨论】:

    • 您仍在尝试(在最后一行)在分配data 之前警告变量。在 HTTP 响应到达之前,分配值的函数不会运行。
    • @byteME — 它是一个 empty 数组(在第 1 行分配),而不是作为 data 传递的值。您可以删除整个 ajax 调用,它会给出相同的结果。
    • 不要读它。他询问如何使 $.isArray 调用返回 true。而我的回答是正确的。如果他因为对 async 的误解而遇到其他问题,他可以再问一个问题。
    • @BryanRoss — 我认为这是对问题主体的过度字面解释,忽略了问题的标题。
    • 对不起,它实际上不起作用.. window.array 是一个数组,但它不存储数据数组的值...
    【解决方案3】:

    第二个警报在第一个警报之前执行,因为 $.get 回调异步执行。如果您希望第二个警报返回 true,则应使用 jQuery Deferred object,如下所示:

    var array;
    
    deferred = $.get('php/getstocklist.php', function(data){  
    
      array = data; 
      alert($.isArray(array));    //alerts true
    
    }, "json");
    
    // alerts true if $.get succeeded
    deferred.done(function () { alert($.isArray(array)); }); 
    

    当异步 $.get 调用返回时,您传递给 done 的回调将触发。

    【讨论】:

      【解决方案4】:

      如果我理解你,为什么你不能

      $.getJSON('php/getstocklist.php', function(data){  
          dosomething(data);
      });
      
      
      function dosomething(data) {}
      

      【讨论】:

        【解决方案5】:

        它有点过时了,但尝试使用它来设置你的变量会脱离请求并使其成为全局

        window.array = data;  
        
        alert($.isArray(window.array));
        

        【讨论】:

        • 它已经是一个全局的(除非代码在一个函数中,在这种情况下它仍然在同一个范围内)。问题是警报在 HTTP 响应返回之前运行。
        猜你喜欢
        • 1970-01-01
        • 2018-08-06
        • 1970-01-01
        • 2023-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多