diff --git a/plugins/CoreHome/angularjs/common/services/piwik-api.js b/plugins/CoreHome/angularjs/common/services/piwik-api.js index 69b962365894c5de2086c17fed3f44e7952b36b5..aed0f7695b310db6a84f1c35b39aeb7d5908cd75 100644 --- a/plugins/CoreHome/angularjs/common/services/piwik-api.js +++ b/plugins/CoreHome/angularjs/common/services/piwik-api.js @@ -42,13 +42,11 @@ angular.module('piwikApp.service').factory('piwikApi', function ($http, $q, $roo * @return $promise */ function send () { - - var deferred = $q.defer(); - var requestHandle = deferred; + var deferred = $q.defer(), + requestPromise = deferred.promise; var onError = function (message) { deferred.reject(message); - requestHandle = null; }; var onSuccess = function (response) { @@ -67,11 +65,9 @@ angular.module('piwikApp.service').factory('piwikApi', function ($http, $q, $roo } else { onError(null); } - } else { deferred.resolve(response); } - requestHandle = null; }; var headers = { @@ -86,25 +82,27 @@ angular.module('piwikApp.service').factory('piwikApi', function ($http, $q, $roo responseType: format, params: _mixinDefaultGetParams(getParams), data: $.param(getPostParams(postParams)), - timeout: deferred.promise, + timeout: requestPromise, headers: headers }; $http(ajaxCall).success(onSuccess).error(onError); + // we can't modify requestPromise directly and add an abort method since for some reason it gets + // removed after then/finally/catch is called. var request = { then: function () { - deferred.promise.then.apply(deferred.promise, arguments); + requestPromise.then.apply(requestPromise, arguments); return this; }, 'finally': function () { - deferred.promise['finally'].apply(deferred.promise, arguments); + requestPromise['finally'].apply(requestPromise, arguments); return this; }, - 'catch': function () { // TODO: cleanup deferred.promise references - deferred.promise['catch'].apply(deferred.promise, arguments); + 'catch': function () { + requestPromise['catch'].apply(requestPromise, arguments); return this; }, @@ -176,6 +174,8 @@ angular.module('piwikApp.service').factory('piwikApi', function ($http, $q, $roo allRequests.forEach(function (request) { request.abort(); }); + + allRequests = []; }; /** diff --git a/plugins/CoreHome/angularjs/common/services/piwik-api_spec.js b/plugins/CoreHome/angularjs/common/services/piwik-api_spec.js index f5033333d3acc5992133b8ca2c51647e21cb92f5..278861c2834de44e735ded684c00db4e1e1de6e6 100644 --- a/plugins/CoreHome/angularjs/common/services/piwik-api_spec.js +++ b/plugins/CoreHome/angularjs/common/services/piwik-api_spec.js @@ -57,6 +57,23 @@ describe('piwikApiClient', function () { $httpBackend.flush(); }); + it("should not fail when multiple aborts are issued", function (done) { + var request = piwikApi.fetch({ + method: "SomePlugin.action" + }).then(function (response) { + done(new Error("Aborted request succeeded!")); + }).catch(function (ex) { + done(ex); + }); + + request.abort(); + request.abort(); + + $httpBackend.flush(); + + request.abort(); + }); + it("should send multiple requests concurrently when fetch is called more than once", function (done) { var request1Done, request2Done;