0

我正在使用 jQuery 函数$.getJSON从服务器端获取一些数据,代码如下:

function (){
  $.getJSON("someURI",function(result){
    //this alert works fine
    alert(result.msg) 
  });

  // this prints the data as undefined
  alert(result.msg); 
}

如何更改返回的“结果”的范围$.getJSON以使其全局化..以使第二个警报打印其值不是未定义的?

4

4 回答 4

4

你不能。AJAX 是异步的,这意味着您只能在回调内部访问result变量。success您可以将其设为全局,但请记住,紧跟在$.getJSON调用之后的行将在回调执行之前success被调用,使其变得无用。

所以没有全局变量,在回调中使用 AJAX 调用的结果:

function () {
    $.getJSON('someURI', function(result){
        // only here you can hope to consume the results of an AJAX call
        alert(result.msg) 
    });
}

这就是 AJAX 的工作原理。AJAX 中的 A 代表异步。

于 2012-08-18T16:16:29.333 回答
3

这是一个异步调用..所以您必须等到服务器响应...在您的情况下,外部警报将未定义,因为服务器尚未响应...此外,范围result仅限于callback function,无法访问...

你可以这样做:

var myJSON;
var serverResponded = 0;

function () {
    $.getJSON("someURI", function (result) {
        //this alert works fine
        myJSON = result.msg;
        serverResponded = 1;
    });
    setTimeout(function () {
        if (serverResponded) {
            alert(myJSON);
        }
    }, 500);
}
于 2012-08-18T16:19:20.943 回答
1

$.getJSON调用是 Ajax 调用的快捷方式,“Ajax”代表“<strong>Asynchronous JavaScript and XML”。

假设您添加var globalResult并且您globalResult = result;在成功函数中执行了一个。因此,当您globalResult在回调之外进行调用时,globalResult还不会被分配。所以,如果你真的必须在外面处理它,你可以检查它是否分配了一个名为 的函数setInterval,但这太过分了。

于 2012-08-18T16:21:01.857 回答
0

将其保存到另一个类似这样的变量中

function (){
var something;
  $.getJSON("someURI",function(result){
    //this alert works fine
    alert(result.msg) 
    something = result
  });

如果您希望它的范围在您的函数包装器之外,请执行以下操作

var something;
function (){
  $.getJSON("someURI",function(result){
    //this alert works fine
    alert(result.msg) 
    something = result
  });
于 2012-08-18T16:19:20.563 回答