如何从 $.getJSON 函数返回变量

Posted

技术标签:

【中文标题】如何从 $.getJSON 函数返回变量【英文标题】:How can I return a variable from a $.getJSON function 【发布时间】:2010-09-07 01:32:46 【问题描述】:

我想返回StudentId 以在$.getJSON()范围 之外的其他地方使用

j.getJSON(url, data, function(result)

    var studentId = result.Something;
);

//use studentId here

我想这与作用域有关,但它似乎与 c# 的工作方式不同

【问题讨论】:

【参考方案1】:

它的工作方式似乎不同 c#确实

要完成类似于 C# 的作用域,请禁用异步操作并将 dataType 设置为 json:

var mydata = [];
$.ajax(
  url: 'data.php',
  async: false,
  dataType: 'json',
  success: function (json) 
    mydata = json.whatever;
  
);

alert(mydata); // has value of json.whatever

【讨论】:

这是一个更好的解决方案,因为 getJSON 是一个异步调用,因此在异步调用完成之前无法访问委托中设置的变量。 有趣的是我有“&callback=?”在我的 URL 中,它似乎覆盖了 async:false 设置。 一直在到处搜索 - 以上答案都不适合我,但这个可以!【参考方案2】:

是的,我之前的回答不起作用,因为我没有注意您的代码。 :)

问题在于匿名函数是一个回调函数 - 即 getJSON 是一个异步操作,将在某个不确定的时间点返回,因此即使变量的范围在该匿名函数之外(即闭包) ,它不会有你认为应该的价值:

var studentId = null;
j.getJSON(url, data, function(result)

    studentId = result.Something;
);

// studentId is still null right here, because this line 
// executes before the line that sets its value to result.Something

您要使用 getJSON 调用设置的 studentId 值执行的任何代码都需要在该回调函数内或回调执行之后发生。 p>

【讨论】:

【参考方案3】:

比上面所有的都简单。如前所述,$.getJSON 执行导致问题的异步。无需将所有代码重构为 $.ajax 方法,只需在主 .js 文件顶部插入以下内容即可禁用异步行为:

 $.ajaxSetup(
   async: false
 );

祝你好运!

【讨论】:

这一定是最佳答案 同意@MostafaKing 这是迄今为止最好的答案。谢谢@bicycle。 请注意,这意味着您的页面将停止加载,直到所有 ajax 请求完成。 Ajax 使用异步是有原因的:所有 ajax 调用都在后台执行,您的页面可以在每个请求进入后立即显示结果。学习如何使用回调并相应地使用它们是有意义的。【参考方案4】:

如果您希望委托给其他功能,您还可以使用 $.fn 扩展 jquery。像这样的符号:

var this.studentId = null; $.getJSON(url, data, function(result) $.fn.delegateJSONResult(result.Something); ); $.fn.delegateJSONResult = function(something) this.studentId = something;

【讨论】:

【参考方案5】:
var context;
$.ajax(
  url: 'file.json',
  async: false,
  dataType: 'json',
  success: function (json)    
    assignVariable(json);
  
);

function assignVariable(data) 
  context = data;

alert(context);

【讨论】:

这个问题是大约 9 年前提出的,您的回答并未对已发布的答案进行任何重大改进。【参考方案6】:

嗯,如果你用StudentId 属性序列化了一个对象,那么我认为它将是:

var studentId;
function(json) 
    if (json.length > 0)
        studentId = json[0].StudentId;

但如果您只是返回 StudentId 本身,可能是:

var studentId;
function(json) 
    if (json.length > 0)
        studentId = json[0];

编辑:或者可能甚至不需要.length(我只返回了 JSON 中的通用集合)。

编辑#2,这行得通,我刚刚测试过:

var studentId;
jQuery.getJSON(url, data, function(json) 
    if (json)
        studentId = json;
);

编辑 #3,这是我使用的实际 JS:

$.ajax(
    type: "POST",
    url: pageName + "/GetStudentTest",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: "id: '" + someId + "'",
    success: function(json) 
        alert(json);
    
);

并在 aspx.vb 中:

<System.Web.Services.WebMethod()> _
<System.Web.Script.Services.ScriptMethod()> _
Public Shared Function GetStudentTest(ByVal id As String) As Integer
    Return 42
End Function

【讨论】:

以上是关于如何从 $.getJSON 函数返回变量的主要内容,如果未能解决你的问题,请参考以下文章

函数等待返回直到 $.getJSON 完成

jQuery .getJSON 返回到数组变量和 json 数组操作

$.getJSON 函数期间设置的变量只能在函数内访问

如何使用 Swift 从一个函数返回不同类型的结构?

如何向 javascript 的 fetch() 函数发送附加数据

NodeJS 不会将数据返回给 jQuery.getJSON