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

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

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

//use studentId here

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
54
0
92 366
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

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

Это гораздо лучшее решение, поскольку getJSON является асинхронным вызовом, поэтому переменная, установленная в делегате, недоступна до завершения асинхронного вызова.

Annagram 13.11.2009 01:05

Достаточно интересно, что у меня был "& callback =?" в моем URL-адресе, который, казалось, переопределял настройку async: false.

Dead account 08.04.2010 15:44

Я искал везде - ни один из приведенных выше ответов не работает для меня, но этот работает!

reectrix 04.08.2016 23:21

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

 $.ajaxSetup({
   async: false
 });

удачи!

это должен быть главный ответ

Mostafa King 10.09.2014 18:59

Согласен с @MostafaKing

DanMad 09.02.2018 13:19

Это, безусловно, лучший ответ. Спасибо @bicycle.

Daniel Kilburn 09.03.2018 17:26

Обратите внимание: это означает, что ваша страница перестает загружаться, пока не будут выполнены все запросы ajax. Ajax использует асинхронность по какой-то причине: все вызовы ajax выполняются в фоновом режиме, и ваша страница может отображать результаты каждого запроса, как только он поступает. Имеет смысл узнать, как работать с обратными вызовами, и использовать их соответственно.

Thawn 03.05.2019 15:45

var context;
$.ajax({
  url: 'file.json',
  async: false,
  dataType: 'json',
  success: function (json) {   
    assignVariable(json);
  }
});

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

Вопрос был задан около 9 лет назад, и ваш ответ не добавляет значительного улучшения к уже опубликованным ответам.

MJ Khan 09.07.2017 20:00

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