Skip to content

Commit

Permalink
Pipeline will now be in charge of executing it self.
Browse files Browse the repository at this point in the history
  • Loading branch information
jeme committed Aug 21, 2014
1 parent ccbc441 commit cba327f
Show file tree
Hide file tree
Showing 8 changed files with 188 additions and 69 deletions.
63 changes: 47 additions & 16 deletions build/angular-routing.js
Original file line number Diff line number Diff line change
Expand Up @@ -832,7 +832,7 @@ angular.module('dotjem.routing').provider('$route', $RouteProvider).value('$rout

/// <reference path="refs.d.ts" />
function $PipelineProvider() {
var stages = [], stagesMap = {}, self = this;
var stages = [], stagesMap = {}, errorHandlers = {}, self = this;

function indexOf(name) {
for (var i = 0, l = stages.length; i < l; i++) {
Expand Down Expand Up @@ -909,15 +909,39 @@ function $PipelineProvider() {
};
};

this.error = function (name, handler) {
errorHandlers[name] = handler;
return this;
};

this.$get = [
'$q', '$inject',
function ($q, $inject) {
var sv = {};

sv.all = function () {
return stages.map(function (stg) {
sv.run = function (locals) {
var all = stages.map(function (stg) {
return $inject.create(stg.stage);
});
var defered = $q.defer();
var promise = $q.when(locals);
forEach(all, function (stage) {
promise = promise.then(function () {
return stage(locals);
});
});
promise.then(defered.resolve, onReject);

function onReject(error) {
locals.$error = error;
forEach(errorHandlers, function (handler) {
handler = $inject.create(handler);
handler(locals);
});

defered.reject(error);
}
return defered;
};

return sv;
Expand Down Expand Up @@ -1089,6 +1113,14 @@ angular.module('dotjem.routing').provider('$pipeline', $PipelineProvider).config
});
}
}]);

pipeline.error('error01', [
'$changes', '$context', '$rootScope', '$state', '$error', function ($changes, $context, $rootScope, $state, $error) {
$rootScope.$broadcast(EVENTS.STATE_CHANGE_ERROR, $context.toState, $state.current, $error);
if ($context.transaction && !$context.transaction.completed) {
$context.transaction.cancel();
}
}]);
}]);

/// <reference path="refs.d.ts" />
Expand Down Expand Up @@ -1887,7 +1919,7 @@ var $StateProvider = [

this.$get = [
'$rootScope', '$q', '$inject', '$route', '$view', '$stateTransition', '$location', '$scroll', '$resolve', '$exceptionHandler', '$pipeline',
function ($rootScope, $q, $inject, $route, $view, $transition, $location, $scroll, $resolve, $exceptionHandler, $stages) {
function ($rootScope, $q, $inject, $route, $view, $transition, $location, $scroll, $resolve, $exceptionHandler, $pipeline) {
function init(promise) {
var defer = $q.defer();
$route.$waitFor(defer.promise);
Expand Down Expand Up @@ -2282,23 +2314,22 @@ var $StateProvider = [
}

var comparer = new StateComparer();
var running, inProgress = false;
function goto(args) {
if (inProgress) {
running.reject("Transition defered by another call to goto");
}
inProgress = true;

var next = browser.resolve(current, toName(args.state), false);
var changes = comparer.path(current, next, $state.params, args.params, { force: args.force });
var context = { gotofn: goto };

var promise = $q.when(changes), context = { gotofn: goto };
forEach($stages.all(), function (stage) {
promise = promise.then(function (path) {
return stage({ $changes: changes, $context: context, $args: args });
});
});
promise.then(function () {
running = $pipeline.run({ $changes: changes, $context: context, $args: args });
running.promise.then(function () {
current = changes.to;
}, function (error) {
$rootScope.$broadcast(EVENTS.STATE_CHANGE_ERROR, context.toState, $state.current, error);
if (context.transaction && !context.transaction.completed) {
context.transaction.cancel();
}
}).finally(function () {
inProgress = false;
});
}
return $state;
Expand Down
2 changes: 1 addition & 1 deletion build/angular-routing.min.js

Large diffs are not rendered by default.

38 changes: 35 additions & 3 deletions build/src/pipeline.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/// <reference path="refs.d.ts" />
function $PipelineProvider() {
var stages = [], stagesMap = {}, self = this;
var stages = [], stagesMap = {}, errorHandlers = {}, self = this;

function indexOf(name) {
for (var i = 0, l = stages.length; i < l; i++) {
Expand Down Expand Up @@ -77,15 +77,39 @@ function $PipelineProvider() {
};
};

this.error = function (name, handler) {
errorHandlers[name] = handler;
return this;
};

this.$get = [
'$q', '$inject',
function ($q, $inject) {
var sv = {};

sv.all = function () {
return stages.map(function (stg) {
sv.run = function (locals) {
var all = stages.map(function (stg) {
return $inject.create(stg.stage);
});
var defered = $q.defer();
var promise = $q.when(locals);
forEach(all, function (stage) {
promise = promise.then(function () {
return stage(locals);
});
});
promise.then(defered.resolve, onReject);

function onReject(error) {
locals.$error = error;
forEach(errorHandlers, function (handler) {
handler = $inject.create(handler);
handler(locals);
});

defered.reject(error);
}
return defered;
};

return sv;
Expand Down Expand Up @@ -257,4 +281,12 @@ angular.module('dotjem.routing').provider('$pipeline', $PipelineProvider).config
});
}
}]);

pipeline.error('error01', [
'$changes', '$context', '$rootScope', '$state', '$error', function ($changes, $context, $rootScope, $state, $error) {
$rootScope.$broadcast(EVENTS.STATE_CHANGE_ERROR, $context.toState, $state.current, $error);
if ($context.transaction && !$context.transaction.completed) {
$context.transaction.cancel();
}
}]);
}]);
25 changes: 12 additions & 13 deletions build/src/state.js
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ var $StateProvider = [

this.$get = [
'$rootScope', '$q', '$inject', '$route', '$view', '$stateTransition', '$location', '$scroll', '$resolve', '$exceptionHandler', '$pipeline',
function ($rootScope, $q, $inject, $route, $view, $transition, $location, $scroll, $resolve, $exceptionHandler, $stages) {
function ($rootScope, $q, $inject, $route, $view, $transition, $location, $scroll, $resolve, $exceptionHandler, $pipeline) {
function init(promise) {
var defer = $q.defer();
$route.$waitFor(defer.promise);
Expand Down Expand Up @@ -627,23 +627,22 @@ var $StateProvider = [
}

var comparer = new StateComparer();
var running, inProgress = false;
function goto(args) {
if (inProgress) {
running.reject("Transition defered by another call to goto");
}
inProgress = true;

var next = browser.resolve(current, toName(args.state), false);
var changes = comparer.path(current, next, $state.params, args.params, { force: args.force });
var context = { gotofn: goto };

var promise = $q.when(changes), context = { gotofn: goto };
forEach($stages.all(), function (stage) {
promise = promise.then(function (path) {
return stage({ $changes: changes, $context: context, $args: args });
});
});
promise.then(function () {
running = $pipeline.run({ $changes: changes, $context: context, $args: args });
running.promise.then(function () {
current = changes.to;
}, function (error) {
$rootScope.$broadcast(EVENTS.STATE_CHANGE_ERROR, context.toState, $state.current, error);
if (context.transaction && !context.transaction.completed) {
context.transaction.cancel();
}
}).finally(function () {
inProgress = false;
});
}
return $state;
Expand Down
63 changes: 47 additions & 16 deletions gh-pages/assets/scripts/angular-routing/impl/angular-routing.js
Original file line number Diff line number Diff line change
Expand Up @@ -832,7 +832,7 @@ angular.module('dotjem.routing').provider('$route', $RouteProvider).value('$rout

/// <reference path="refs.d.ts" />
function $PipelineProvider() {
var stages = [], stagesMap = {}, self = this;
var stages = [], stagesMap = {}, errorHandlers = {}, self = this;

function indexOf(name) {
for (var i = 0, l = stages.length; i < l; i++) {
Expand Down Expand Up @@ -909,15 +909,39 @@ function $PipelineProvider() {
};
};

this.error = function (name, handler) {
errorHandlers[name] = handler;
return this;
};

this.$get = [
'$q', '$inject',
function ($q, $inject) {
var sv = {};

sv.all = function () {
return stages.map(function (stg) {
sv.run = function (locals) {
var all = stages.map(function (stg) {
return $inject.create(stg.stage);
});
var defered = $q.defer();
var promise = $q.when(locals);
forEach(all, function (stage) {
promise = promise.then(function () {
return stage(locals);
});
});
promise.then(defered.resolve, onReject);

function onReject(error) {
locals.$error = error;
forEach(errorHandlers, function (handler) {
handler = $inject.create(handler);
handler(locals);
});

defered.reject(error);
}
return defered;
};

return sv;
Expand Down Expand Up @@ -1089,6 +1113,14 @@ angular.module('dotjem.routing').provider('$pipeline', $PipelineProvider).config
});
}
}]);

pipeline.error('error01', [
'$changes', '$context', '$rootScope', '$state', '$error', function ($changes, $context, $rootScope, $state, $error) {
$rootScope.$broadcast(EVENTS.STATE_CHANGE_ERROR, $context.toState, $state.current, $error);
if ($context.transaction && !$context.transaction.completed) {
$context.transaction.cancel();
}
}]);
}]);

/// <reference path="refs.d.ts" />
Expand Down Expand Up @@ -1887,7 +1919,7 @@ var $StateProvider = [

this.$get = [
'$rootScope', '$q', '$inject', '$route', '$view', '$stateTransition', '$location', '$scroll', '$resolve', '$exceptionHandler', '$pipeline',
function ($rootScope, $q, $inject, $route, $view, $transition, $location, $scroll, $resolve, $exceptionHandler, $stages) {
function ($rootScope, $q, $inject, $route, $view, $transition, $location, $scroll, $resolve, $exceptionHandler, $pipeline) {
function init(promise) {
var defer = $q.defer();
$route.$waitFor(defer.promise);
Expand Down Expand Up @@ -2282,23 +2314,22 @@ var $StateProvider = [
}

var comparer = new StateComparer();
var running, inProgress = false;
function goto(args) {
if (inProgress) {
running.reject("Transition defered by another call to goto");
}
inProgress = true;

var next = browser.resolve(current, toName(args.state), false);
var changes = comparer.path(current, next, $state.params, args.params, { force: args.force });
var context = { gotofn: goto };

var promise = $q.when(changes), context = { gotofn: goto };
forEach($stages.all(), function (stage) {
promise = promise.then(function (path) {
return stage({ $changes: changes, $context: context, $args: args });
});
});
promise.then(function () {
running = $pipeline.run({ $changes: changes, $context: context, $args: args });
running.promise.then(function () {
current = changes.to;
}, function (error) {
$rootScope.$broadcast(EVENTS.STATE_CHANGE_ERROR, context.toState, $state.current, error);
if (context.transaction && !context.transaction.completed) {
context.transaction.cancel();
}
}).finally(function () {
inProgress = false;
});
}
return $state;
Expand Down

Large diffs are not rendered by default.

34 changes: 32 additions & 2 deletions src/pipeline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
function $PipelineProvider() {
var stages = [],
stagesMap = {},
errorHandlers = {},
self = this;

function indexOf(name) {
Expand Down Expand Up @@ -76,12 +77,34 @@ function $PipelineProvider() {
};
};

this.error = function (name, handler) {
errorHandlers[name] = handler;
return this;
};

this.$get = [<any>'$q', '$inject',
function ($q: ng.IQService, $inject: dotjem.routing.IInjectService) {
var sv: any = {};

sv.all = function () {
return stages.map(stg => $inject.create(stg.stage));
sv.run = function (locals) {
var all = stages.map(stg => $inject.create(stg.stage));
var defered = $q.defer();
var promise = $q.when(locals);
forEach(all, stage => {
promise = promise.then(() => stage(locals));
});
promise.then(defered.resolve, onReject);

function onReject(error) {
locals.$error = error;
forEach(errorHandlers, handler => {
handler = $inject.create(handler);
handler(locals);
});

defered.reject(error);
}
return defered;
};

return sv;
Expand Down Expand Up @@ -251,4 +274,11 @@ angular.module('dotjem.routing').provider('$pipeline', $PipelineProvider)
}
}]);

pipeline.error('error01', ['$changes', '$context', '$rootScope', '$state', '$error', function ($changes, $context, $rootScope, $state, $error) {
$rootScope.$broadcast(EVENTS.STATE_CHANGE_ERROR, $context.toState, $state.current, $error);
if ($context.transaction && !$context.transaction.completed) {
$context.transaction.cancel();
}
}]);

}]);
Loading

0 comments on commit cba327f

Please sign in to comment.