在相同 class 的 setTimeout 期间维护变量
Maintain variables during setTimeout within same class
如何在 class 属性和其他变量失去范围并变得未定义的情况下调用 setTimeout? 的答案是使用函数闭包,因此在 setTimeout 期间获取并维护范围内变量的 'snapshot'。但是,这似乎在 class 中不起作用。例如
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
此 returns 未为 MyVar 定义。如果我将 Function A_Closure 移动到非 class .as 文件,一切正常并且 MyVar = 10,但这似乎是一种非常 hacky 的方法。在 class 中是否有公认的使用 setTimeout 的方法?
这个项目我只能使用 AS2(CryEngine 中的 Scaleform)。
谢谢。
如果您想以 AS2 方式执行此操作,那么在将函数 'linked' 保留为实例变量的同时调用函数的解决方案是使用 Delegate.
您的 setTimeout 行将更改为如下所示:
setTimeout(Delegate.create(this, FunctionC), 1000);
我自己从未使用过 scaleform,但 documentation 表明 Delegate 在库中可用 gfx.utils.Delegate
,这与 Adobe 版本不同,但调用看起来相同。
代表没有魔法。通过创建一个带有参数的函数,该函数创建另一个使用这些参数的函数,当您调用第一个函数时,您就是 'storing' 这些参数。 (重要的是该函数必须在另一个函数中 定义 ,而不仅仅是 调用 )。这可能是您在 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);
所有代码都是记忆中的,我没有测试所以可能会有错误。
尝试将 "this" 存储在调用函数的闭包中,这样它就不会复制 myvar。
示例。
function a() {
var scope:MyClass = this;
setTimeout(function() {
scope.MyVar = 0; // this should hit the actual value of the class
}, 1000);
}
如何在 class 属性和其他变量失去范围并变得未定义的情况下调用 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
此 returns 未为 MyVar 定义。如果我将 Function A_Closure 移动到非 class .as 文件,一切正常并且 MyVar = 10,但这似乎是一种非常 hacky 的方法。在 class 中是否有公认的使用 setTimeout 的方法?
这个项目我只能使用 AS2(CryEngine 中的 Scaleform)。
谢谢。
如果您想以 AS2 方式执行此操作,那么在将函数 'linked' 保留为实例变量的同时调用函数的解决方案是使用 Delegate.
您的 setTimeout 行将更改为如下所示:
setTimeout(Delegate.create(this, FunctionC), 1000);
我自己从未使用过 scaleform,但 documentation 表明 Delegate 在库中可用 gfx.utils.Delegate
,这与 Adobe 版本不同,但调用看起来相同。
代表没有魔法。通过创建一个带有参数的函数,该函数创建另一个使用这些参数的函数,当您调用第一个函数时,您就是 'storing' 这些参数。 (重要的是该函数必须在另一个函数中 定义 ,而不仅仅是 调用 )。这可能是您在 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);
所有代码都是记忆中的,我没有测试所以可能会有错误。
尝试将 "this" 存储在调用函数的闭包中,这样它就不会复制 myvar。
示例。
function a() {
var scope:MyClass = this;
setTimeout(function() {
scope.MyVar = 0; // this should hit the actual value of the class
}, 1000);
}