【问题标题】:Persist function scope variable values across callback invocations在回调调用中保持函数范围变量值
【发布时间】:2017-11-12 04:46:45
【问题描述】:

我正在使用 NodeMCU 的cron 模块来安排一些事情。但是,我还希望有一个附加功能能够根据年份进行安排,并且仅在当前时间介于所需日期范围之间时才运行回调。

为了使上述工作有效,我需要将日期范围值保留在回调中以进行检查,但是 Lua 似乎不会在调用之间保留函数范围变量。

这是我使用 ESPlorer 上传到 ESP-12F 的示例代码:

> 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 中的本地(函数范围)静态变量的功能。

谢谢

【问题讨论】:

    标签: lua callback esp8266 nodemcu


    【解决方案1】:
    do
       local innervar = outervar
    
       function sched_callback(e)
          if innervar == 1 then
             print("Every minute")
          end
       end
    end
    
    cron.schedule("* * * * *", sched_callback)
    

    【讨论】:

    • 谢谢@EgorSkriptunoff .. 我看到您已经使用了像 JS 中那样立即调用的函数,并且您正在返回一个立即调用的函数对象。但我只是想知道每次我们返回函数时,它如何保留innervar 值而不管outervar。我认为在每个时间表/每一分钟它都会再次将outervar 分配给innervar,对吗?即使 outervar 外部更改为 0,innervar 的值是否仍为 1。另外,我现在将在我的 ESP 上尝试一下,你能补充一点解释吗?和Upvoted :)
    • 将代码修改为更易于理解,并在不同的cron.schedule 调用之间保留innervar 值(回调函数可以被多个调度重用)。
    • 我认为你误解了。我不想在不同的cron.schedule 中重复使用回调函数。当sched_callback 被多次调用时,我想保持innervar 值。即使 outervar 在外部发生变化,我也不希望 innervar 值因回调而发生变化。
    • innervar 仅被初始化一次 - 在创建函数 sched_callback 之前,它不会在 sched_callback 内部进行修改(除非您明确进行此类修改)
    猜你喜欢
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    相关资源
    最近更新 更多