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

IT技术 javascript jquery ajax scope return-value
2021-01-19 17:30:36

我想回到StudentId别处外使用的范围$.getJSON()

j.getJSON(url, data, function(result)
{
    var studentId = result.Something;
});

//use studentId here

我猜想这是与范围有关,但它似乎不相同的方式工作C#

6个回答

它似乎与 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
有趣的是,我有“&callback=?” 在我的 URL 中,它似乎覆盖了 async:false 设置。
2021-03-24 17:30:36
到处搜索 - 以上答案都不适合我,但这个答案适用!
2021-03-28 17:30:36
这是一个更好的解决方案,因为 getJSON 是一个异步调用,因此在异步调用完成之前无法访问委托中设置的变量。
2021-04-02 17:30:36

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

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

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 值执行的任何代码都需要该回调函数内或回调执行之后发生。

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

 $.ajaxSetup({
   async: false
 });

祝你好运!

这是迄今为止最好的答案。谢谢@bicycle。
2021-03-15 17:30:36
这必须是最佳答案
2021-03-18 17:30:36
同意@MostafaKing
2021-03-31 17:30:36
请注意,这意味着您的页面将停止加载,直到所有 ajax 请求完成。Ajax 使用 async 是有原因的:所有 ajax 调用都在后台执行,您的页面可以在每个请求进入时立即显示结果。学习如何使用回调并相应地使用它们是有意义的。
2021-04-13 17:30:36

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


var this.studentId = null;

$.getJSON(url, data, 
    function(result){
      $.fn.delegateJSONResult(result.Something);
    }
);

$.fn.delegateJSONResult = function(something){
  this.studentId = something;
}


var context;
$.ajax({
  url: 'file.json',
  async: false,
  dataType: 'json',
  success: function (json) {   
    assignVariable(json);
  }
});

function assignVariable(data) {
  context = data;
}
alert(context);
这个问题是在大约 9 年前提出的,您的回答并没有对已经发布的答案做出任何重大改进。
2021-03-19 17:30:36