UNPKG

angular-state-router

Version:

An AngularJS state-based router designed for flexibility and ease of use.

102 lines (86 loc) 2.4 kB
'use strict'; module.exports = ['$rootScope', function($rootScope) { /** * Execute a series of functions; used in tandem with middleware */ var Queue = function() { var _list = []; var _data = null; var _self = { /** * Add a handler * * @param {Mixed} handler A Function or an Array of Functions to add to the queue * @return {Queue} Itself; chainable */ add: function(handler, priority) { if(handler && handler.constructor === Array) { handler.forEach(function(layer) { layer.priority = typeof layer.priority === 'undefined' ? 1 : layer.priority; }); _list = _list.concat(handler); } else { handler.priority = priority || (typeof handler.priority === 'undefined' ? 1 : handler.priority); _list.push(handler); } return this; }, /** * Data object * * @param {Object} data A data object made available to each handler * @return {Queue} Itself; chainable */ data: function(data) { _data = data; return this; }, /** * Begin execution and trigger callback at the end * * @param {Function} callback A callback, function(err) * @return {Queue} Itself; chainable */ execute: function(callback) { var nextHandler; var executionList = _list.slice(0).sort(function(a, b) { return Math.max(-1, Math.min(1, b.priority - a.priority)); }); nextHandler = function() { $rootScope.$evalAsync(function() { var handler = executionList.shift(); // Complete if(!handler) { callback(null); // Next handler } else { handler.call(null, _data, function(err) { // Error if(err) { callback(err); // Continue } else { nextHandler(); } }); } }); }; // Start nextHandler(); } }; return _self; }; // Instance return { /** * Factory method * * @return {Queue} A queue */ create: function() { return Queue(); } }; }];