Как я могу вернуть переменную из функции $ .getJSON - PullRequest
50 голосов
/ 28 августа 2008

Я хочу вернуть StudentId для использования за пределами области действия из $.getJSON()

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

//use studentId here

Я бы предположил, что это связано с областью видимости, но, похоже, это не работает так же c # делает

Ответы [ 6 ]

61 голосов
/ 17 июня 2009

похоже, это не работает 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
39 голосов
/ 28 августа 2008

Да, мой предыдущий ответ не работает, потому что я не обратил никакого внимания на ваш код. :)

Проблема в том, что анонимная функция является функцией обратного вызова - то есть 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

Любой код, который вы хотите выполнить со значением studentId, установленным вызовом getJSON, должен произойти либо в этой функции обратного вызова, либо после обратного вызова.

20 голосов
/ 23 марта 2013

Еще проще, чем все вышеперечисленное. Как объяснено ранее, $.getJSON выполняет асинхронный вызов, который вызывает проблему. Вместо рефакторинга всего вашего кода методом $.ajax просто вставьте следующее в начало вашего основного файла .js, чтобы отключить асинхронное поведение:

 $.ajaxSetup({
   async: false
 });

удачи!

2 голосов
/ 30 января 2009

Если вы хотите делегировать другим функциям, вы также можете расширить jquery с помощью $ .fn. обозначение как так:


var this.studentId = null;

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

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


0 голосов
/ 09 июля 2017
var context;
$.ajax({
  url: 'file.json',
  async: false,
  dataType: 'json',
  success: function (json) {   
    assignVariable(json);
  }
});

function assignVariable(data) {
  context = data;
}
alert(context);
0 голосов
/ 28 августа 2008

хм, если вы сериализовали объект со свойством 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).

Edit # 2, это работает, я только что проверил:

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

Edit # 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
...