调用 $.get 方法时如何使 javascript 变量成为全局变量? [复制]

Posted

技术标签:

【中文标题】调用 $.get 方法时如何使 javascript 变量成为全局变量? [复制]【英文标题】:How to make a javascript variable global when called the $.get method? [duplicate] 【发布时间】: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 是否已经被第二个警报执行了? 【参考方案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 响应返回之前运行。

以上是关于调用 $.get 方法时如何使 javascript 变量成为全局变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

通过Vuejs调用时如何使Nodejs重定向工作

如何在数据库中使龙卷风请求成为原子

当我从中调用非静态方法时,如何使处理程序静态以避免泄漏?

如何使数组列表的这个 get 方法更简单? [复制]

JavaScrip ajaxt和python flask通过json传递数据的方法

CSS:如何使光标成为输入文件上的指针?