2016-01-02 5 views
-1

Я уже несколько часов борюсь с этой проблемой, мой js-код, который я запускаю в node.js, приведен ниже.Javascript Scope Неожиданные результаты

setInterval(function() { 
    var exampleVar; 
    exec('cat /path/to/unimportant/file', function (error, stdout, stderr) { // This function returns errors, stdout and stderr 
     console.log(stdout); // correct value 
     exampleVar = stdout; 
     console.log(exampleVar); // correct value 
    } 
    console.log(exampleVar); // undefined 
}, unimportantTime); 

Я бы думать, что, так как переменная уже была объявлена ​​функция Exec созданной родительской сферы, что я смог бы присвоить ему значение. Может ли кто-то объяснить, что я делаю неправильно, и правильный метод доступа к переменной вне области?

+0

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

+1

Я не думаю, что в этом вопросе есть что-то неправильное, но одна причина может заключаться в том, что, поскольку один и тот же вопрос задают несколько раз каждый день, некоторые люди могут получить реакцию «о нет, не снова». – JJJ

+0

Это обычное дело для общих вопросов;/ – lleaff

ответ

3

Ваша проблема не из scope, но и синхронности.

В Node.js большинство функций по умолчанию асинхронны, что означает, что выполнение вашей программы продолжается независимо от того, действительно ли эти функции завершены.

Так происходит, что ваш последний console.log(exampleVar) выполняет перед тем, как функция, переданная в exec, успела выполнить (поскольку операции ввода-вывода, как правило, медленнее, чем выполнение кешированного JS-кода).

См. this primer для более подробного объяснения.

+0

Это то, что я искал, спасибо! – Sheerforce

+0

@Sheerforce Добро пожаловать! Btw, пожалуйста, отметьте ответ, как принято, чтобы люди знали, что вы решили свою проблему. – lleaff

+0

Мне пришлось ждать 10 минут, я сделал это сейчас. – Sheerforce