关于javascript:如何从$ .getJSON函数返回变量

关于javascript:如何从$ .getJSON函数返回变量

How can I return a variable from a $.getJSON function

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

1
2
3
4
5
6
j.getJSON(url, data, function(result)
{
    var studentId = result.Something;
});

//use studentId here

我想这与范围界定有关,但似乎与c#的工作方式不同


it doesn't seem to work the same way
c# does

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

1
2
3
4
5
6
7
8
9
10
11
var mydata = [];
$.ajax({
  url: 'data.php',
  async: false,
  dataType: 'json',
  success: function (json) {
    mydata = json.whatever;
  }
});

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

是的,我之前的答案不起作用,因为我没有对您的代码给予任何关注。 :)

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

1
2
3
4
5
6
7
8
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执行异步会导致问题。无需将所有代码重构为$.ajax方法,只需将以下内容插入主.js文件的顶部即可禁用异步行为:

1
2
3
 $.ajaxSetup({
   async: false
 });

祝好运!


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<wyn>
var this.studentId = null;

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

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

</wyn>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var context;
$.ajax({
  url: 'file.json',
  async: false,
  dataType: 'json',
  success: function (json) {  
    assignVariable(json);
  }
});

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

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

1
2
3
4
5
var studentId;
function(json) {
    if (json.length > 0)
        studentId = json[0].StudentId;
}

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

1
2
3
4
5
var studentId;
function(json) {
    if (json.length > 0)
        studentId = json[0];
}

编辑:或者也许甚至不需要.length(我只以JSON返回了通用集合)。

编辑#2,这有效,我刚刚测试过:

1
2
3
4
5
var studentId;
jQuery.getJSON(url, data, function(json) {
    if (json)
        studentId = json;
});

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

1
2
3
4
5
6
7
8
9
10
$.ajax({
    type:"POST",
    url: pageName +"/GetStudentTest",
    contentType:"application/json; charset=utf-8",
    dataType:"json",
    data:"{id: '" + someId +"'}",
    success: function(json) {
        alert(json);
    }
});

并在aspx.vb中:

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


推荐阅读