Я хочу вернуть StudentId для использования в другом месте за пределами объем$.getJSON()
j.getJSON(url, data, function(result)
{
var studentId = result.Something;
});
//use studentId here
Я бы предположил, что это связано с областью видимости, но, похоже, это не работает так же, как C#.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Да, мой предыдущий ответ не работает, потому что я не обратил внимания на ваш код. :)
Проблема в том, что анонимная функция является функцией обратного вызова, то есть 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, должен выполняться либо в этой функцией обратного вызова, либо после, выполняемой обратным вызовом.
хм, если вы сериализовали объект со свойством 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
Если вы хотите делегировать другие функции, вы также можете расширить jquery с помощью $ .fn. обозначение так:
var this.studentId = null;
$.getJSON(url, data,
function(result){
$.fn.delegateJSONResult(result.Something);
}
);
$.fn.delegateJSONResult = function(something){
this.studentId = something;
}
it doesn't seem to work the same way c# does
Чтобы выполнить область видимости, аналогичную 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
Достаточно интересно, что у меня был "& callback =?" в моем URL-адресе, который, казалось, переопределял настройку async: false.
Я искал везде - ни один из приведенных выше ответов не работает для меня, но этот работает!
Даже проще, чем все вышеперечисленное. Как объяснялось ранее, $.getJSON выполняет асинхронный режим, который вызывает проблему. Вместо рефакторинга всего кода в соответствии с методом $.ajax просто вставьте следующее в верхнюю часть основного файла .js, чтобы отключить асинхронное поведение:
$.ajaxSetup({
async: false
});
удачи!
это должен быть главный ответ
Согласен с @MostafaKing
Это, безусловно, лучший ответ. Спасибо @bicycle.
Обратите внимание: это означает, что ваша страница перестает загружаться, пока не будут выполнены все запросы ajax. Ajax использует асинхронность по какой-то причине: все вызовы ajax выполняются в фоновом режиме, и ваша страница может отображать результаты каждого запроса, как только он поступает. Имеет смысл узнать, как работать с обратными вызовами, и использовать их соответственно.
var context;
$.ajax({
url: 'file.json',
async: false,
dataType: 'json',
success: function (json) {
assignVariable(json);
}
});
function assignVariable(data) {
context = data;
}
alert(context);
Вопрос был задан около 9 лет назад, и ваш ответ не добавляет значительного улучшения к уже опубликованным ответам.
Это гораздо лучшее решение, поскольку getJSON является асинхронным вызовом, поэтому переменная, установленная в делегате, недоступна до завершения асинхронного вызова.