我希望有一系列功能一个接一个地执行,而不是在另一个功能中执行。
这就是我的意思......
假设您有三个功能
f1(){
trace("f1 start")
f2();
trace("f1 end")
}
f2(){
trace("f2 start")
f3();
trace("f2 end")
}
f3(){
trace("f3 start")
trace("f3 end")
}
如果您运行f1()
,则应该
f1 start
f2 start
f3 start
f3 end
f2 end
f1 end
关于以fifo顺序推送函数的机制的任何想法,以便我可以:
f1 start
f1 end
f2 start
f2 end
f3 start
f3 end
如果我使用函数执行函数,如何通知事件已完成?每个函数是否需要一个事件调度程序才能使函数异步运行?
答案 0 :(得分:3)
如果事件同步,您可以使用以下内容:
var fArray:Array = [f1, f2, f3];
fArray.forEach(function(item:Function, i:int, a:Array):void {
item();
});
如果功能是同步的,上述功能将起作用。由于保证执行顺序。
另一方面,如果您的功能可能是异步,那么您需要使用事件,信号或回调。
我可能会使用回调。请参阅下面的示例。遗憾的是你无法扩展Function类,但它已被标记为final。无论如何,在这个例子中,fManager在开始时被调用一次以使其继续运行并自动完成其余的操作。每次完成一个函数时,它都会调用fManager并引用自身,因此可以从列表中删除它。
var fArray:Array = [f1, f2, f3];
function fManager(_f:Function = null) {
// Remove the one that just finished
if(_f !== null) {
fArray.splice(_f, 1);
}
// Run the next one
if(fArray.length > 0) {
// sends in function manager
fArray[0](arguments.callee);
}
}
function f1(f:Function):void {
trace("f1");
// Captures the current function
fManager(arguments.callee);
return;
}
function f2(f:Function):void {
trace("f1");
// Captures the current function
fManager(arguments.callee);
return;
}
function f3(f:Function):void {
trace("f3");
// Captures the current function
fManager(arguments.callee);
return;
}
// Start the code
fManager();
答案 1 :(得分:0)
玩了一下......
现在代替在其他函数中运行的函数,它只发生在execute
函数内,其他函数(f1,f2等)完全关闭,因为我们正在使用return函数。
以这种方式运行函数的优点是,函数正在使用的任何资源都不能由同一函数编辑,并且在为函数创建的资源的情况下,它们可以被标记为垃圾收集在下一个功能开始之前。
public function startSequence():void {
execute(f1);
}
public function execute($f1:Function):void {
var $f2:Function = $f1();
if ($f2 != null) {
execute($f2);
}
}
public function f1():Function {
trace("f1");
return f2
}
public function f2():Function {
trace("f2");
return null
}
另一种方法是使用timer事件,其中事件执行由onComplete侦听器处理,时间设置为0。