diff --git a/js/index.js b/js/index.js index 6315378..5fa9eb0 100644 --- a/js/index.js +++ b/js/index.js @@ -97,6 +97,11 @@ function updateRoute(evt) { router.setOptions(evt.options); + + // abort pending requests from previous rerouteAllSegments + if (!router.queue.idle()) { + router.queue.kill(); + } routing.rerouteAllSegments(onUpdate); } @@ -156,7 +161,9 @@ function onUpdate(err) { if (err) { - BR.message.showError(err); + if (err !== L.BRouter.ABORTED_ERROR) { + BR.message.showError(err); + } return; } else { BR.message.hideError(); diff --git a/js/router/BRouter.js b/js/router/BRouter.js index 4dd67d9..4aeaae2 100644 --- a/js/router/BRouter.js +++ b/js/router/BRouter.js @@ -5,7 +5,8 @@ L.BRouter = L.Class.extend({ URL_PROFILE_UPLOAD: BR.conf.host + '/brouter/profile', PRECISION: 6, NUMBER_SEPARATOR: ',', - GROUP_SEPARATOR: '|' + GROUP_SEPARATOR: '|', + ABORTED_ERROR: 'aborted' }, options: { @@ -18,6 +19,16 @@ L.BRouter = L.Class.extend({ this.queue = async.queue(L.bind(function (task, callback) { this.getRoute(task.segment, callback); }, this), 1); + + // patch to call callbacks on kill for cleanup (loadingTrailer) + this.queue.kill = function () { + var aborted = this.tasks; + this.drain = null; + this.tasks = []; + aborted.forEach(function(task) { + task.callback(L.BRouter.ABORTED_ERROR); + }); + }; }, setOptions: function(options) {