2013-12-04 2 views
2

У меня проблема. В журнале указано, что переменная «gData» не определена. Но, на мой взгляд, это должно быть, потому что его глобальное? Вы можете помочь?node.js - глобальная переменная не работает?

function refreshGroupData(){ 
     groupModel.count(function(err, count){ 
     gData = count; 
     io.sockets.emit('sendGroupData', gData); 
    }); 
     console.log ('Test: ' + gData); 
    } 

Спасибо, Роберт.

Edit:

function refreshGroupData(){ 
     function test(callback){ 
      groupModel.count(function(err, count){ 
       callback(count) 
      }); 
     } 
     test(function(count) { 
      io.sockets.emit('sendGroupData', count); 
      console.log('Test: ' + count); 
     }); 
} 
+0

Это ваш полный пример кода? – chsh

+0

нет. его единственная функция, которую я вызываю в своем коде. – nofear87

ответ

1

переменная GData внутри анонимной функции .. поэтому является локальной для этой функции.

+0

ОК, я думал, что объявление «var gData» является локальным, а «gData» является глобальным. поэтому я не понимаю его: D есть ли способ получить его читаемым вне функции? – nofear87

+0

Объявление за пределами функции refreshGroupData является одним из вариантов. –

+0

Я протестировал его, но он не работал ... он не будет перезаписан функцией refreshgroupData :( – nofear87

2

Проблема заключается в том, что вы указываете значение глобальной переменной gData перед ее настройкой.

Поскольку вы не объявляете gData, его значение не может быть оценено до тех пор, пока не будет выполнен gData = count;. И поскольку эта строка выполняется в асинхронном обратном вызове groupModel.count(...), линия console.log(...) выполняется до того, как это произойдет.

Если вы переместите вызов console.log внутри обратного вызова, он будет работать.

function refreshGroupData() { 
    groupModel.count(function(err, count) { 
     gData = count; 
     io.sockets.emit('sendGroupData', gData); 
     console.log('Test: ' + gData); 
    }); 
} 

Правильный способ сделать такие вещи, как это:

function refreshGroupData(callback) { 
    groupModel.count(function(err, count) { 
     io.sockets.emit('sendGroupData', count); 
     callback(count); 
    }); 
} 

// Calling the function and logging the result. 
refreshGroupData(function(count) { 
    console.log('Test: ' + count); 
}); 
+0

Ahh ok, я знаю, что он работал внутри. Но мне это нужно снаружи, потому что я буду использовать переменную для некоторых других вещей. Есть ли способ использовать ее снаружи? Как я могу проверить, что функция готова? – nofear87

+2

@ nofear87 Вы должны изменить 'refreshGroupData', чтобы принять параметр обратного вызова, который он вызовет с подсчетом, когда он будет доступен, передав ему счет в качестве параметра. См. обновленный ответ. – JohnnyHK

+0

спасибо, thats near ly, что ищут iam ;-) Могу ли я использовать обратный вызов в функции groupModel.count? так что я могу использовать переменную в функции обновления, а не только снаружи? Надеюсь, ты меня понял – nofear87

Смежные вопросы