Вопрос

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

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

//use studentId here

Я бы предположил, что это связано с определением области видимости, но, похоже, это работает по-другому 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

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

Другие советы

он, кажется, не работает таким же образом язык C# не

Чтобы выполнить определение области видимости, аналогичное 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 метод просто вставьте следующее в начало вашего основного файла .js, чтобы отключить асинхронное поведение:

 $.ajaxSetup({
   async: false
 });

удачи вам!

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


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

хм, если вы сериализовали объект с помощью 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top