работа с последовательностью функций линейно (as3) - PullRequest
2 голосов
/ 26 июня 2011

Я хочу иметь ряд функций, которые выполняются одна за другой, а не одна внутри другой.

вот что я имею в виду ...

Допустим, у вас есть три функции

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 ]

3 голосов
/ 26 июня 2011

Если события запускаются синхронно , вы можете сделать что-то простое:

var fArray:Array = [f1, f2, f3];

fArray.forEach(function(item:Function, i:int, a:Array):void { 
    item();
});

Выше будет работать, если функции синхронны.Поскольку порядок выполнения гарантирован.

С другой стороны, если ваши функции могут быть асинхронными , вам необходимо использовать либо события, сигналы, либо обратные вызовы.

Я вероятно использовал бы обратные вызовы для этого.Смотрите пример ниже.Жаль, что вы не можете расширить класс Function, но он был помечен как финальный.В любом случае, в этом примере 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();
0 голосов
/ 26 июня 2011

немного поиграл с этим ... теперь вместо функции, выполняемой внутри других функций, это происходит только внутри функции execute, остальные функции (f1, f2 и т. д.) закрываются полностью, потому что мы используем функцию возврата.

Преимущество выполнения функции таким образом заключается в том, что любые ресурсы, которые используются функциями, не могут редактироваться одной и той же функцией, а в случае ресурсов, созданных для функции, они могут быть помечены для сбора мусора. до запуска следующей функции.

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
}

Еще один способ сделать это - использовать событие таймера, где о событии заботится слушатель onComplete с временем, установленным в 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...