Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.10.2012, 00:12
Новичок на форуме
Отправить личное сообщение для drunia85 Посмотреть профиль Найти все сообщения от drunia85
 
Регистрация: 13.10.2012
Сообщений: 3

Callback функция и глобальные переменные
Всем привет. Скажу сразу, что проблему вызовов асинхронных функций и считывания результатов из глобальных переменных я понимаю.
Но столкнулся с для меня непонятной проблемой.
Суть проблемы:
Есть некоторая callback функция (Web SQL) вызываемая в результате успешного завершения запроса к БД. Там я считываю данные и записываю в глобальные переменные:

var totalSum = maxSum = 0; 

db.transaction(
  sql, [],
  function(tx, rs) {
    totalSum = rs.rows.item(0)['totalSum'];
    maxSum  = rs.rows.item(0)['maxSum'];
    var button = document.getElementById('button');
    button.setAttribute('onclick', 'checkMyVars();');
  },
  function(tx, err) {alert(err.message)}
);

function checkMyVars() {
  alert('totalSum = ' + totalSum + ' maxSum = ' + maxSum);
}


Так вот после выполнения запроса к БД я при нажатии на кнопку получаю 0!
А вот сам непонятный мне момент: Если вызывать функцию checkMyVars() в теле callback функции то получаю ожидаемые значения в глобальных переменных. В чем проблема мне непонятно (
Буду очень рад пояснениям ...
Ответить с цитированием
  #2 (permalink)  
Старый 14.10.2012, 01:11
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

<button type="button" id="button">button</button>
<script>
var totalSum = maxSum = 0; 

setTimeout(function() {
totalSum = 1;
    maxSum  = 2;
    var button = document.getElementById('button');
    button.setAttribute('onclick', 'checkMyVars();');
}, 1000);

function checkMyVars() {
  alert('totalSum = ' + totalSum + ' maxSum = ' + maxSum);
}
</script>


Работает, только всё равно так, как вы делаете, делать точно не надо.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #3 (permalink)  
Старый 14.10.2012, 01:38
Новичок на форуме
Отправить личное сообщение для drunia85 Посмотреть профиль Найти все сообщения от drunia85
 
Регистрация: 13.10.2012
Сообщений: 3

Nekromancer,
Спасибо, в этом случае действительно работает. Но у меня по прежнему не работает с моим случаем. Почему так делать не нужно, чем это чревато? как было было бы правильно ?
Для меня досихпор остается загадкой тот факт, что при вызове

var totalSum = maxSum = 0; 

db.transaction(
  sql, [],
  function(tx, rs) {
    totalSum = rs.rows.item(0)['totalSum'];
    maxSum  = rs.rows.item(0)['maxSum'];
    var button = document.getElementById('button');

    checkMyVars();

  },
  function(tx, err) {alert(err.message)}
);

function checkMyVars() {
  alert('totalSum = ' + totalSum + ' maxSum = ' + maxSum);
}

Все отрабатывает как я и ожидаю, а вот в случае назначения обработчика

var totalSum = maxSum = 0; 

db.transaction(
  sql, [],
  function(tx, rs) {
    totalSum = rs.rows.item(0)['totalSum'];
    maxSum  = rs.rows.item(0)['maxSum'];
    var button = document.getElementById('button');

    button.setAttribute('onclick', 'checkMyVars();');

  },
  function(tx, err) {alert(err.message)}
);

function checkMyVars() {
  alert('totalSum = ' + totalSum + ' maxSum = ' + maxSum);
}

при нажатии на кнопку у меня переменные остаются не измененными.
Ответить с цитированием
  #4 (permalink)  
Старый 14.10.2012, 01:42
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Ну примерно так:
(function() {
var totalSum = 0, 
maxSum = 0;


    var button = document.getElementById('button');
    button.onclick = checkMyVars;
// либо сразу button.addEventListener('click', checkMyVars, false);
 
db.transaction(
  sql, [],
  function(tx, rs) {
    totalSum = rs.rows.item(0)['totalSum'];
    maxSum  = rs.rows.item(0)['maxSum'];
  },
  function(tx, err) {alert(err.message)}
);
 
function checkMyVars() {
  alert('totalSum = ' + totalSum + ' maxSum = ' + maxSum);
}

}());
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #5 (permalink)  
Старый 14.10.2012, 01:57
Новичок на форуме
Отправить личное сообщение для drunia85 Посмотреть профиль Найти все сообщения от drunia85
 
Регистрация: 13.10.2012
Сообщений: 3

Nekromancer, огромное СПАСИБО с
button.onclick = checkmyVars;

заработало. Но в чем же проблема? Через setAttribute() получается обработчик как бы ранее связывается с элементом ???
Ответить с цитированием
  #6 (permalink)  
Старый 14.10.2012, 02:06
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

drunia85,
даже не знаю, что там происходит с этой функцией, вообще так не стоит вешать события и однозначно, их нужно вешать заранее, а не потом, как было у вас.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция не меняет глобальные переменные, считая их локальными alex_oo7 Общие вопросы Javascript 2 13.10.2012 13:32
Глобальные переменные Гео_zen Общие вопросы Javascript 8 27.08.2012 14:30
глобальные переменные сайта и js leko Общие вопросы Javascript 8 01.07.2012 09:53
Глобальные переменные kilogram Серверные языки и технологии 3 30.03.2012 14:59
Ajax и Json callback функция borabora Prototype & script.aculo.us 0 30.01.2012 13:01