diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 054fb2523ac6..b90068e1438e 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -823,7 +823,9 @@ angular.module('ngResource', ['ng']). function cancelRequest(value) { promise.catch(noop); - timeoutDeferred.resolve(value); + if (timeoutDeferred !== null) { + timeoutDeferred.resolve(value); + } } }; diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index bc8bbd079642..65f4e893aa91 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -2101,6 +2101,25 @@ describe('cancelling requests', function() { expect(creditCard.$cancelRequest).toBe(noop); }); + + it('should not break when calling old `$cancelRequest` after the response arrives', function() { + $httpBackend.whenGET('/CreditCard').respond({}); + + var CreditCard = $resource('/CreditCard', {}, { + get: { + method: 'GET', + cancellable: true + } + }); + + var creditCard = CreditCard.get(); + var cancelRequest = creditCard.$cancelRequest; + + $httpBackend.flush(); + + expect(cancelRequest).not.toBe(noop); + expect(cancelRequest).not.toThrow(); + }); }); describe('configuring `cancellable` on the provider', function() {