Сохранять значения переменных области действия функции при вызовах обратного вызова

Я использую модуль cron NodeMCU для планирования некоторых вещей. Однако я также хочу, чтобы дополнительная функция могла планировать на основе лет, а также запускать обратный вызов только тогда, когда текущее время находится между желаемым диапазоном дат.

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

Вот пример кода, который я загрузил в ESP-12F с помощью ESPlorer:

> outervar = 1
> cron.schedule("* * * * *", function(e)
                     local innervar = outervar
                     if innervar == 1 then
                           print("Every minute")
                     end
                 end)
> Every minute
> Every minute
> outervar=0
> 

Я позволил Every minute печатать 2 раза (т.е. расписание работало для 2 вызовов), но как только я сделал outervar=0, он остановился, что означает, что outervar распространился на innervar.

Мне нужно сохранить значения innervar при вызовах обратного вызова. Любая помощь приветствуется. Короче говоря, мне нужна функциональность, аналогичная локальным (область действия) статическим переменным в C.

Спасибо


person riteshtch    schedule 10.06.2017    source источник


Ответы (1)


person    schedule
comment
Спасибо @EgorSkriptunoff .. Я вижу, что вы использовали немедленно вызываемые функции, как в JS, и вы возвращаете объект функции, который вызывается немедленно. Но мне просто интересно каждый раз, когда мы возвращаем функцию, как она сохранит значение innervar независимо от outervar. Я думаю, что в каждом расписании/каждую минуту он снова будет назначать outervar на innervar, верно? Будет ли innervar по-прежнему иметь значение 1, даже если outervar изменится на 0 снаружи. Также я сейчас попробую это на своем ESP, и не могли бы вы добавить немного пояснений, пожалуйста? и проголосовал тоже :) - person riteshtch; 10.06.2017
comment
Код изменен, чтобы сделать его более понятным и сохранить значение innervar между различными вызовами cron.schedule (функция обратного вызова может быть повторно использована несколькими расписаниями). - person Egor Skriptunoff; 10.06.2017
comment
Я думаю, вы неверно истолковали. Я не хочу повторного использования функции обратного вызова в разных cron.schedule. Я хочу сохранить значение innervar, когда sched_callback вызывается несколько раз. Даже если outervar изменится снаружи, я не хочу, чтобы значение innervar менялось для обратного вызова. - person riteshtch; 10.06.2017
comment
innervar инициализируется только один раз - перед созданием функции sched_callback она не модифицируется внутри sched_callback (если только вы явно не сделаете такую ​​модификацию) - person Egor Skriptunoff; 10.06.2017