线性处理函数序列(as3)

时间:2011-06-25 22:44:36

标签: actionscript-3 function

我希望有一系列功能一个接一个地执行,而不是在另一个功能中执行。

这就是我的意思......

假设您有三个功能

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

如果我使用函数执行函数,如何通知事件已完成?每个函数是否需要一个事件调度程序才能使函数异步运行?

2 个答案:

答案 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。