Подтвердить что ты не робот

Как я могу вернуть переменную из функции $.getJSON

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

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

//use studentId here

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

4b9b3361

Ответ 1

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

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

Ответ 2

похоже, что он работает одинаково С# делает

Чтобы выполнить обзор, аналогичный С#, отключите операции async и установите для параметра 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

Ответ 3

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

 $.ajaxSetup({
   async: false
 });

Удачи!

Ответ 4

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


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);

Ответ 6

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