Advertisement
Guest User

Untitled

a guest
Jun 19th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.96 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement