daily pastebin goal
57%
SHARE
TWEET

Untitled

a guest Jun 19th, 2017 51 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package
  2. {
  3.     import flash.utils.Dictionary;
  4.    
  5.     /**
  6.      * Управление вызовом асинхронных функйии.
  7.      * Позволяет выполнять функции последовательно, паралельно и в режиме водопада.
  8.      * @author Andrey Shatalov
  9.      */
  10.     public class ControllFlow
  11.     {
  12.  
  13.         //{ region ------------------------ Public metods
  14.         /**
  15.          * Позволяет вызвать серию асинхронных методов
  16.          * @param   metods массив функций, принимают callBack:Function
  17.          * @param   callBack результаты выполенения методов или обработчик ошибки, принимаеет (error:Object, data:Array)
  18.          */
  19.         static public function Series(methods:Array, callBack:Function):void
  20.         {
  21.             if (methods.length != 0)
  22.             {
  23.                 var task:Function = methods.shift();
  24.                 task(MapSeries(methods, callBack, []));
  25.             }
  26.             else
  27.             {
  28.                 callBack(null, null);
  29.             }
  30.         }
  31.          
  32.         /**
  33.          * Паралельный вызов асинхронных методов.
  34.          * @param   methods массив методов, которые необходимо выполнить паралельно, принимают callBack:Function
  35.          * @param   callBack результаты выполенения методов или обработчик ошибки, принимаеет (error:Object, data:Array)
  36.          */
  37.         static public function Parallel(methods:Array, callBack:Function):void
  38.         {
  39.             if (methods.length != 0)
  40.             {
  41.                 var taskMap:Array = new Array;
  42.                 for each (var method:Function in methods)
  43.                 {
  44.                     taskMap.push({ task:method, data:null });
  45.                 }
  46.                 //вторым циклом запускаем все таски
  47.                 for (var i:String in taskMap)
  48.                 {
  49.                     taskMap[i]['task'](MapParallel(taskMap,callBack,i));
  50.                 }  
  51.             }
  52.             else
  53.             {
  54.                 callBack(null,null);
  55.             }
  56.         }
  57.          
  58.         /**
  59.          * Последовательный вызов асинхронных методов, которые могут передавать результаты друг другу
  60.          * @param   methods массив методов, которые выполняются последовательно, принимают ...params,callBack:Function
  61.          * @param   callBack результаты выполенения методов или обработчик ошибки, принимаеет (error:Object, data:Array)
  62.          */
  63.         static public function WaterFall(methods:Array, callBack:Function):void
  64.         {
  65.             if (methods.length != 0)
  66.             {
  67.                 var task:Function = methods.shift();
  68.                 task(MapWaterFall(methods, callBack));
  69.             }
  70.             else
  71.             {
  72.                 callBack(null, null);
  73.             }
  74.         }
  75.          
  76.         //} endregion --------------------- Public metods      
  77.         //{ region ------------------------ Private metods
  78.          
  79.      
  80.          
  81.         /**
  82.          * Конструктор функции, которая будет вызвана колбэком после выполнения метода из списка
  83.          * @param   methods
  84.          * @param   callBack
  85.          * @param   data
  86.          * @return
  87.          */
  88.         static private function MapSeries(methods:Array, callBack:Function, data:Array ):Function
  89.         {
  90.             var resp:Function = function(error:Object, newData:*):void
  91.             {
  92.                 if (error == null)
  93.                 {
  94.                     if(newData != null) data.push(newData);
  95.                      
  96.                     if (methods.length != 0)
  97.                     {
  98.                         var task:Function = methods.shift();
  99.                         task(MapSeries(methods, callBack, data));
  100.                     }
  101.                     else
  102.                     {
  103.                         callBack(null, data);
  104.                     }
  105.                 }
  106.                 else
  107.                 {
  108.                     callBack(error, null);
  109.                 }
  110.             }
  111.              
  112.             return resp;
  113.         }
  114.          
  115.         /**
  116.          * Конструктор, который собирает последовательную обработку асинхронных методов, с возможностью передавать данные в друг друга
  117.          * @param   methods список методов, которые необходимо выполнить
  118.          * @param   callBack
  119.          * @param   ... data произвольное количество параметров
  120.          */
  121.         static private function MapWaterFall(methods:Array, callBack:Function):Function
  122.         {
  123.             var resp:Function = function(error:Object, ... values):void
  124.             {
  125.                 if (error == null)
  126.                 {
  127.                     if (methods.length != 0)
  128.                     {
  129.                         var task:Function = methods.shift();
  130.                         //task(MapWaterFall.apply(this,values));//apply позволяет передать заведомо неизвестное количество аргуметов в функцию MapWaterFall
  131.                          
  132.                         values.push(MapWaterFall(methods,callBack));//добавляем callback в конец массива данных
  133.                         task.apply(this, values);
  134.                     }
  135.                     else
  136.                     {
  137.                         callBack(null, values);
  138.                     }
  139.                 }
  140.                 else
  141.                 {
  142.                     callBack(error, null);
  143.                 }
  144.             }
  145.              
  146.             return resp;
  147.         }
  148.                  
  149.         /**
  150.          * Конструктор функции для паралельного выполения асинхронных функций
  151.          * @param   taskMap карта методов вида {task:Function,data:* = null}
  152.          * @param   callBack
  153.          * @param   i итератор для taskMap
  154.          */
  155.         static private function MapParallel(taskMap:Array, callBack:Function, i:String):Function
  156.         {
  157.             var foo:Function = function(error:Object, data:* = null):void
  158.             {
  159.                 //Debug.trace(_TITLE_CLASS + 'OnComplete вызван ' + data, Debug.LEVEL_DEBUG);
  160.                 if (error == null)
  161.                 {
  162.                     //Debug.trace(i);
  163.                     taskMap[i]['data'] = data? data: { complete: true };//NOTE на будущее стоит пересмотреть данные по умолчанию
  164.                      
  165.                     for each (var item:Object in taskMap)
  166.                     {
  167.                         if (item['data'] == null) return;                          
  168.                     }
  169.                     //код ниже выполнится, если карта задач окажется заполена данными, которые != null
  170.                     //по идее будет выполнена только один раз
  171.                     var respData:Array = new Array();
  172.                     for each (item in taskMap)
  173.                     {
  174.                         respData.push(item['data']);
  175.                     }
  176.                     callBack(null, respData);
  177.                 }
  178.                 else
  179.                 {
  180.                     callBack(error, null);//NOTE в случае ошибок колбек будет вызван для каждой
  181.                 }
  182.             }          
  183.             return foo;
  184.         }
  185.         //} endregion --------------------- Private metods
  186.     }
  187.  
  188. }
RAW Paste Data
Top