Возвращение переменных внутри функций JS / JSON - PullRequest
2 голосов
/ 31 июля 2010

Я пытаюсь понять JSON, обратные вызовы и т. Д. В JS.Из приведенного ниже измененного примера вы увидите, что я использую функцию обратного вызова из $ .getJSON.Затем я прыгаю в getSomething () и ожидаю, что он изменит мою переменную результата.Это изменяет его в рамках функции, но не когда я выпрыгиваю из этой функции.

Из 2 console.log () вы увидите, что первый отображает правильно, а второй - нет.Я уверен, что ответ на мой вопрос связан с возвратом переменных через.обратный вызов, но может кто-нибудь просветить
меня :)

Спасибо!

КОД:

$.getJSON('/cart.js', function (cart, textStatus) {
  var result = '';
  result += 'Sample Stuff';
  StackOverflow.getSomething(param1, param2, function(a, b) {
    for(j=0; j < b.length; j++) {
      if (b.options[j] != 'Default Title') {
        if (a.options[j].name.indexOf("Color") > -1) {
          result += b.options[j].name;
          console.log(result); // <-- It comes out correct (Sample Stuff + b.options...)
        }
      }
    }
  });
  console.log(result); // <-- It comes out incorrect, just (Sample Stuff)
});

1 Ответ

0 голосов
/ 31 июля 2010

Я думаю, StackOverflow.getSomething() выполняет запрос AJAX?Таким образом, то, что определено внутри его обратного вызова (циклически проходящего через a и b), не выполняется, пока не завершится запрос AJAX.Что происходит, так это то, что StackOverflow.getSomething запускается, а затем console.log(result) в конце вашего кода выполняется сразу после этого.К тому времени обратный вызов StackOverflow.getSomething еще не был запущен, а result еще не обновлен.Только "Образец материала" регистрируется.Но когда второй файл console.log выполняется в обратном вызове после запроса AJAX (getSomething), result обновляется и регистрируется "правильно".

Другими словами, порядок выполнения будет следующим

  1. Установка result на "Пример материала"
  2. StackOverflow.getSomething() запускает запрос AJAX с прикрепленной функцией обратного вызова
  3. console.log(result) регистрирует "Пример материала"
  4. Обратный вызов ajax завершается и запускает функцию обратного вызова.result обновляется соответствующим образом путем итерации по a и b
  5. Функция обратного вызова console.log(result) записывает окончательное значение result
...