From 2955bbf6b8db70c45a1848b5705ee9f47588bf81 Mon Sep 17 00:00:00 2001 From: Stanislav Komanec Date: Wed, 11 Feb 2015 13:25:07 +0100 Subject: [PATCH 1/2] fix(ngResource): canceling XHR request using promise --- src/ngResource/resource.js | 4 +++- test/ngResource/resourceSpec.js | 34 ++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 4c37ad48ce62..46642157db20 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -568,8 +568,10 @@ angular.module('ngResource', ['ng']). undefined; forEach(action, function(value, key) { - if (key != 'params' && key != 'isArray' && key != 'interceptor') { + if (key != 'params' && key != 'isArray' && key != 'interceptor' && key != 'timeout') { httpConfig[key] = copy(value); + } else if (key == 'timeout') { + httpConfig[key] = value; } }); diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 0fa7fc52959b..b19bb53ddd0f 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -1308,7 +1308,7 @@ describe("resource", function() { }); describe('resource', function() { - var $httpBackend, $resource; + var $httpBackend, $resource, $q; beforeEach(module(function($exceptionHandlerProvider) { $exceptionHandlerProvider.mode('log'); @@ -1319,6 +1319,7 @@ describe('resource', function() { beforeEach(inject(function($injector) { $httpBackend = $injector.get('$httpBackend'); $resource = $injector.get('$resource'); + $q = $injector.get('$q'); })); @@ -1356,5 +1357,36 @@ describe('resource', function() { ); }); + it('If timeout promise is resolved, cancel the request', function() { + var canceler = $q.defer(); + + $httpBackend.when('GET', '/CreditCard').respond({data: '123'}); + + var CreditCard = $resource('/CreditCard', {}, { + query: { + method: 'GET', + timeout: canceler.promise + } + }); + + CreditCard.query(); + + canceler.resolve(); + expect(function() { $httpBackend.flush();}).toThrow(new Error("No pending request to flush !")); + + canceler = $q.defer(); + CreditCard = $resource('/CreditCard', {}, { + query: { + method: 'GET', + timeout: canceler.promise + } + }); + + CreditCard.query(); + expect(function() { $httpBackend.flush();}).not.toThrow(new Error("No pending request to flush !")); + + + }); + }); From 3da5b534aade0cde43253f6e8be39460240feb60 Mon Sep 17 00:00:00 2001 From: Stanislav Komanec Date: Sun, 23 Aug 2015 20:06:17 +0200 Subject: [PATCH 2/2] fix(ngResource): canceling XHR request using promise - refactor --- src/ngResource/resource.js | 15 +++++++++++---- test/ngResource/resourceSpec.js | 8 +++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 46642157db20..07a11c49fcdc 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -568,10 +568,17 @@ angular.module('ngResource', ['ng']). undefined; forEach(action, function(value, key) { - if (key != 'params' && key != 'isArray' && key != 'interceptor' && key != 'timeout') { - httpConfig[key] = copy(value); - } else if (key == 'timeout') { - httpConfig[key] = value; + switch (key) { + default: + httpConfig[key] = copy(value); + break; + case 'params': + case 'isArray': + case 'interceptor': + break; + case 'timeout': + httpConfig[key] = value; + break; } }); diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index b19bb53ddd0f..cc7906438a6f 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -1357,7 +1357,7 @@ describe('resource', function() { ); }); - it('If timeout promise is resolved, cancel the request', function() { + it('should cancel the request if timeout promise is resolved', function() { var canceler = $q.defer(); $httpBackend.when('GET', '/CreditCard').respond({data: '123'}); @@ -1372,7 +1372,7 @@ describe('resource', function() { CreditCard.query(); canceler.resolve(); - expect(function() { $httpBackend.flush();}).toThrow(new Error("No pending request to flush !")); + expect($httpBackend.flush).toThrow(new Error("No pending request to flush !")); canceler = $q.defer(); CreditCard = $resource('/CreditCard', {}, { @@ -1383,9 +1383,7 @@ describe('resource', function() { }); CreditCard.query(); - expect(function() { $httpBackend.flush();}).not.toThrow(new Error("No pending request to flush !")); - - + expect($httpBackend.flush).not.toThrow(); });