【问题标题】:Maintain variables during setTimeout within same class在同一类中的 setTimeout 期间维护变量
【发布时间】: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)。

谢谢。

【问题讨论】:

    标签: flash actionscript scope settimeout actionscript-2


    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-28
      • 2018-09-09
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2011-11-08
      • 2017-12-03
      相关资源
      最近更新 更多