Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从$.getJSON函数返回变量_Javascript_Jquery_Ajax_Scope_Return Value - Fatal编程技术网

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

Javascript 如何从$.getJSON函数返回变量,javascript,jquery,ajax,scope,return-value,Javascript,Jquery,Ajax,Scope,Return Value,我想返回StudentId,以便在$.getJSON()范围之外的其他地方使用 我可以想象这与作用域有关,但它似乎与c#的工作方式不同是的,我以前的回答不起作用,因为我没有注意到你的代码。:) 问题在于匿名函数是一个回调函数,即getJSON是一个异步操作,将在某个不确定的时间点返回,因此即使变量的作用域在匿名函数(即闭包)之外,它也不会具有您认为应该具有的值: var studentId = null; j.getJSON(url, data, function(result) { s

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


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

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

问题在于匿名函数是一个回调函数,即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值执行的任何代码都需要在该回调函数内执行,或者在执行回调函数后执行

hmm,如果您使用
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
_
_
作为整数的公共共享函数GetStudentTest(ByVal id作为字符串)
返回42
端函数

如果希望委托给其他函数,也可以使用$.fn扩展jquery。表示法如下:


var this.studentId = null;

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

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

这似乎不一样 是的

要完成类似于C#的作用域,请禁用异步操作并将数据类型设置为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
执行异步,这会导致问题。不要将所有代码重构为
$.ajax
方法,只需在main.js文件的顶部插入以下内容即可禁用异步行为:

 $.ajaxSetup({
   async: false
 });

祝你好运

这是一个更好的解决方案,因为getJSON是一个异步调用,所以在异步调用完成之前无法访问委托中的变量集。有趣的是,我的URL中有“&callback=?”似乎覆盖了async:false设置。我一直在到处搜索-上面的答案对我都不起作用,但这个答案对我有效!这一定是最重要的答案同意@mostafaking这是迄今为止最好的答案。谢谢@bicycle。注意,这意味着在所有ajax请求完成之前,页面将停止加载。Ajax使用async的原因是:所有Ajax调用都是在后台执行的,您的页面可以在收到每个请求后立即显示其结果。学习如何处理回调并相应地使用它们是有意义的。这个问题大约是9年前提出的,你的答案并没有给已经发布的答案带来任何显著的改进。
var context;
$.ajax({
  url: 'file.json',
  async: false,
  dataType: 'json',
  success: function (json) {   
    assignVariable(json);
  }
});

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

function assignVariable(data) {
  context = data;
}
alert(context);