Доброго времени суток, Хабр и читатели.
Картинка для привлечения внимания.
В предыдущем (и первом моём посте) мы говорили про удобоваримость чтения написанного кода. То, зачем и был написан мной тот класс Instruction. В этом посте речь пойдёт уже о самом удобстве использования класса инструкции. А так же, о начале написания библиотеки утилиток.
Почти за два месяца после первой статьи, я успел столкнуться с разными задачами, связанными с последовательным выполнением скриптов. В процессе, класс инструкции оброс дополнительными функциями. А так же, на свет появилась ещё одна утилитка «Order». Порядок, или список задач — можно интерпретировать как угодно. Принцип работы схож с оригинальной инструкцией. Но, обо всём по порядку.
Инструкция обычная:
public function init():void {
Async.instruction
.add(commandOne, 'Param for commandOne')
.add(commandTwo, 100500)
.add(commandThree, [1, 2, 3, 4, 5])
.execute(finalCommand, 'instruction executed successfully');
}
private function commandOne(completeCb:Function, string:String):void {
trace(string); // 'Param for commandOne'
completeCb();
}
private function commandTwo(completeCb:Function, number:int):void {
trace(number); // 100500
completeCb();
}
private function commandThree(completeCb:Function, array:Array):void {
trace(array); // [1, 2, 3, 4, 5]
completeCb();
}
private function finalCommand(input:String):void {
trace(input); // 'instruction executed successfully'
}
Все функции выполняются последовательно. Так же, стоит учесть, что класс теперь выкинет ошибку в случае, если в одной из команд не будет присутствовать ни одного аргумента. По логике — один аргумент в вызываемой команде должен быть гарантированно — completeCallback, для передачи очереди следующей функции. Ещё момент — в команды и в финальную функцию параметры можно вообще не передавать в момент объявления инструкции.
Инструкция с кучей:
public function init():void {
Async.instruction.add(commandOne)
.add(commandTwo, 100500)
.add(commandThree, { type:'init data' } )
.executeCollectingHeap(finalCommand);
}
private function commandOne(completeCb:Function):void {
completeCb('commandOne', '1');
}
private function commandTwo(completeCb:Function, number:int):void {
trace(number); // 100500
completeCb('commandTwo', 2);
}
private function commandThree(completeCb:Function, object:Object):void {
trace(JSON.stringify(object)); // { type:'init data' }
completeCb('commandThree', {type:3});
}
private function finalCommand(heapResult:Array):void {
trace(heapResult[0]); // ['commandOne', '1']
trace(heapResult[1]); // ['commandTwo', 2]
trace(heapResult[2]); // ['commandThree', {type:3}]
trace('Instruction with heap executed successfully');
}
Особенность этого вида инструкции в том, что вызываемые коллбеки по завершению каждой из команд — могут передавать любое количество параметров. Внутри инструкции они бережно собираются в массив и в конце инструкции передаются финальной команде, что можно видеть по закомментированным подсказкам в коде. Так же, особенность в том, что в финальную команду на этапе объявления инструкции мы ничего не передаём.
Order, или список действий
public function init() {
Async.order
.add(commandOne)
.add(commandTwo)
.add(commandThree)
.execute(finalCommand);
}
private function commandOne(completeCb:Function):void {
completeCb('string from commandOne');
}
private function commandTwo(completeCb:Function, string:String):void {
trace(string); // string from commandOne
completeCb(2, 'string from commandTwo');
}
private function commandThree(completeCb:Function, number:int, string:String):void {
trace(number); // 2
trace(string); // string from commandTwo
completeCb();
}
private function finalCommand():void {
trace('Order completed');
}
Этот вид я выделил отдельно, т.к. функционал инструкции был излишним, а городить кучу условий, впаивая новую логику — не захотелось. Суть здесь в том, что каждая команда по цепочке (по порядку) передаёт в следующую какие-либо данные. Очень удобно использовать в случае общения с api сервисов.
Весь код выложен на гитхаб. Заложено начало для небольшой (а, может быть, и большой в дальнейшем, кто знает?!) библиотеки.
Буду очень рад любой критике и комментариям в адрес библиотек. И крайне признателен за поправки или улучшения.
Автор: Frost47rus