在同一类中的 setTimeout 期间维护变量

Posted

技术标签:

【中文标题】在同一类中的 setTimeout 期间维护变量【英文标题】:Maintain variables during setTimeout within same class 【发布时间】:2015-12-01 14:26:09 【问题描述】:

如何在没有类属性和其他变量失去范围并变得未定义的情况下调用 setTimeout? this question regarding variable scope with setTimeout 的答案是使用函数闭包,以便在 setTimeout 期间获取并维护范围内变量的“快照”。然而,这似乎不适用于班级。例如

class MyClass

public var MyVar:Number;

Function A_Closure()
     FunctionC();
;

Function B()
     MyVar = 10;
     setTimeout(A_Closure, 1000);
;

Function C()
     trace("MyVar = " + MyVar); // returns Undefined
;

; // End class

这将为 MyVar 返回未定义。如果我将 Function A_Closure 移动到非类 .as 文件中,一切正常且 MyVar = 10,但这似乎是一种非常老套的方法。有没有公​​认的方法在类中使用 setTimeout?

对于这个项目,我仅限于使用 AS2(CryEngine 中的 Scaleform)。

谢谢。

【问题讨论】:

【参考方案1】:

如果您想以 AS2 方式执行此操作,则调用函数同时保持它们“链接”到实例变量的解决方案是使用 Delegate。

您的 setTimeout 行将更改为如下所示:

setTimeout(Delegate.create(this, FunctionC), 1000);

我自己从未使用过 scaleform,但 documentation 表明 Delegate 在库中可用 gfx.utils.Delegate,这与 Adob​​e 版本不同,但调用看起来相同。

代表不是魔术。通过创建一个带有参数的函数,该函数创建另一个使用这些参数的函数,您在调用第一个函数时“存储”了这些参数。 (重要的部分是函数必须在另一个函数中定义,而不仅仅是调用)。这可能是您在 A_Closure 函数中尝试执行的操作。

基于 javascript 的伪代码:

   function createClosure(obj) 
      return function () 
          // this if not a 'universal' solution like Delegate
          // because it calls this specific function
          obj.FunctionC();
      
   ;

现在你应该将你的 setTimeout() 函数更新为这样的:

setTimeout(createClosure(this), 1000);

所有代码均来自内存,我没有测试,所以可能会有错误。

【讨论】:

您好,感谢您的建议,并对延迟回复表示歉意。 Delegate 方法可以很好地调用函数并保留变量,但不幸的是 setTimeout 似乎失去了它的时间参数并立即执行,无论提供什么值。我已经搜索了一段时间来寻找一个示例,该示例显示了一个带有 setTimout 的委托,但空手而归。你有例子吗? 看起来您不小心调用了该函数,而不是将引用传递给该函数。您是否在创建委托时使用了“FunctionC”,而不是意外地使用了“FunctionC()”?后者是函数的调用,而前者只是对函数的引用——引用就是你需要的。 是的,我是在调用而不是传递引用。问题已解决,再次感谢。【参考方案2】:

尝试将“this”存储在调用函数的闭包中,这样它就不会复制 myvar。

示例。

function a() 
    var scope:MyClass = this;
    setTimeout(function() 
        scope.MyVar = 0;  // this should hit the actual value of the class
    , 1000);

【讨论】:

以上是关于在同一类中的 setTimeout 期间维护变量的主要内容,如果未能解决你的问题,请参考以下文章

将实例变量作为参数传递给同一类中的方法?

如何从同一项目中的另一个类访问主类中的变量? [复制]

梳理:python—同一个类中的方法调用

无法从同一类中的闭包中更改变量 [swift 3.0]

Android Studio 如何把一个类中的所有同一个变量名直接统一改

父类中的私有变量