From 393dbff2e766dd103c9ed71851fb564fc08e6de1 Mon Sep 17 00:00:00 2001 From: Partap Davis Date: Wed, 24 Oct 2012 14:40:11 -0700 Subject: [PATCH 1/4] feat ($resource): Add $q promise property $resource attaches the promise returned from $http to the new resource as $q property. New resource also has $resolved property, which is set to true when $q is resolved. --- src/ngResource/resource.js | 10 ++++++++-- test/ngResource/resourceSpec.js | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index ab5dc52a4a4c..371fbc4b9ab8 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -367,12 +367,18 @@ angular.module('ngResource', ['ng']). } var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data)); - $http({ + + value.$resolved = false; + var resolved = function () {value.$resolved = true;}; + + value.$q = $http({ method: action.method, url: route.url(extend({}, extractParams(data, action.params || {}), params)), data: data, headers: extend({}, action.headers || {}) - }).then(function(response) { + }).success(resolved).error(resolved); + + value.$q.then(function(response) { var data = response.data; if (data) { diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index dc837f8030b2..5c9cc8d02d17 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -228,7 +228,7 @@ describe("resource", function() { $httpBackend.expect('GET', '/CreditCard?key=value').respond([{id: 1}, {id: 2}]); var ccs = CreditCard.query({key: 'value'}, callback); - expect(ccs).toEqual([]); + expect(ccs).toEqualData([]); expect(callback).not.toHaveBeenCalled(); $httpBackend.flush(); From 9b892a97e0ba45539f6b4804eed6df83984346c4 Mon Sep 17 00:00:00 2001 From: Partap Davis Date: Thu, 8 Nov 2012 18:12:29 -0800 Subject: [PATCH 2/4] updated docs --- src/ngResource/resource.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 371fbc4b9ab8..8962a1f5477c 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -88,6 +88,8 @@ * - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])` * - non-GET instance actions: `instance.$action([parameters], [success], [error])` * + * The Resource object now contains the promise from the underlying {@link ng.$http} call, which is accessable + * by the `$q` property, as well as a `$resolved` property, which is set to `true` when the promise is resolved (or rejected). * * @example * From 6f13bcf16a17744651e913233b5335dbf3727094 Mon Sep 17 00:00:00 2001 From: Partap Davis Date: Fri, 9 Nov 2012 13:01:45 -0800 Subject: [PATCH 3/4] test ($resource): $q promise property Add tests to verify state of $q promise and $resolved properties for the default actions (get, query, save, delete) --- test/ngResource/resourceSpec.js | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 5c9cc8d02d17..fb1b34966e3c 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -354,6 +354,53 @@ describe("resource", function() { expect(person.name).toEqual('misko'); }); + it("should have $q and $resolved properties for get", function () { + $httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'}); + var cc = CreditCard.get({id: 123}, callback); + expect(cc.$q).toBeDefined(); + expect(typeof cc.$q).toBe('object'); + expect(cc.$resolved).toBeFalsy(); + $httpBackend.flush(); + expect(cc.$q).toBeDefined(); + expect(cc.$resolved).toBeTruthy(); + }); + + it("should have $q and $resolved properties for query", function() { + $httpBackend.expect('GET', '/CreditCard?key=value').respond([{id: 1}, {id: 2}]); + + var ccs = CreditCard.query({key: 'value'}, callback); + expect(ccs.$q).toBeDefined(); + expect(typeof ccs.$q).toBe('object'); + expect(ccs.$resolved).toBeFalsy(); + $httpBackend.flush(); + expect(ccs.$q).toBeDefined(); + expect(ccs.$resolved).toBeTruthy(); + }); + + it("should have $q and $resolved properties for save", function() { + $httpBackend.expect('POST', '/CreditCard/123', '{"id":{"key":123},"name":"misko"}'). + respond({id: {key: 123}, name: 'rama'}); + + var cc = CreditCard.save({id: {key: 123}, name: 'misko'}, callback); + expect(cc.$q).toBeDefined(); + expect(typeof cc.$q).toBe('object'); + expect(cc.$resolved).toBeFalsy(); + $httpBackend.flush(); + expect(cc.$q).toBeDefined(); + expect(cc.$resolved).toBeTruthy(); + }); + + it('should should have $q and $resolved properties for delete', function() { + $httpBackend.expect('DELETE', '/CreditCard/123').respond({}); + var removed = CreditCard.remove({id:123}, callback); + expect(removed.$q).toBeDefined(); + expect(typeof removed.$q).toBe('object'); + expect(removed.$resolved).toBeFalsy(); + $httpBackend.flush(); + expect(removed.$q).toBeDefined(); + expect(removed.$resolved).toBeTruthy(); + }); + describe('failure mode', function() { var ERROR_CODE = 500, From 005e865e5629a241d99c69a18f85fc2bb5abb1bc Mon Sep 17 00:00:00 2001 From: Partap Davis Date: Fri, 9 Nov 2012 13:04:59 -0800 Subject: [PATCH 4/4] fix($resource): $q promise property $q and $resolved properties overwritten when data is received and promise is resolved. Add properties back into resource object. --- src/ngResource/resource.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 8962a1f5477c..960f1c2aad3f 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -382,7 +382,7 @@ angular.module('ngResource', ['ng']). value.$q.then(function(response) { var data = response.data; - + var q = value.$q, resolved = value.$resolved; if (data) { if (action.isArray) { value.length = 0; @@ -391,6 +391,8 @@ angular.module('ngResource', ['ng']). }); } else { copy(data, value); + value.$q = q; + value.$resolved = resolved; } } (success||noop)(value, response.headers);