Skip to content

Commit f3bff27

Browse files
Partap Davismhevery
Partap Davis
authored andcommitted
feat(resource): add $q/$resorved property to Resource
1 parent 4df45b2 commit f3bff27

File tree

2 files changed

+68
-4
lines changed

2 files changed

+68
-4
lines changed

src/ngResource/resource.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@
109109
* - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])`
110110
* - non-GET instance actions: `instance.$action([parameters], [success], [error])`
111111
*
112+
* The Resource also has these properties:
113+
*
114+
* - '$q': the promise from the underlying {@link ng.$http} call.
115+
* - '$resolved': true if the promise has been resolved (either with success or rejection);
116+
* Knowing if the Resource has been resolved is useful in data-binding.
112117
*
113118
* @example
114119
*
@@ -362,6 +367,8 @@ angular.module('ngResource', ['ng']).
362367
var data;
363368
var success = noop;
364369
var error = null;
370+
var promise;
371+
365372
switch(arguments.length) {
366373
case 4:
367374
error = a4;
@@ -397,7 +404,8 @@ angular.module('ngResource', ['ng']).
397404
}
398405

399406
var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data));
400-
var httpConfig = {};
407+
var httpConfig = {},
408+
promise;
401409

402410
forEach(action, function(value, key) {
403411
if (key != 'params' && key != 'isArray' ) {
@@ -407,9 +415,15 @@ angular.module('ngResource', ['ng']).
407415
httpConfig.data = data;
408416
httpConfig.url = route.url(extend({}, extractParams(data, action.params || {}), params))
409417

410-
$http(httpConfig).then(function(response) {
411-
var data = response.data;
418+
function markResolved() { value.$resolved = true; };
412419

420+
promise = $http(httpConfig);
421+
value.$q = promise;
422+
value.$resolved = false;
423+
promise.then(markResolved, markResolved)
424+
promise.then(function(response) {
425+
var data = response.data;
426+
var q = value.$q, resolved = value.$resolved;
413427
if (data) {
414428
if (action.isArray) {
415429
value.length = 0;
@@ -418,12 +432,15 @@ angular.module('ngResource', ['ng']).
418432
});
419433
} else {
420434
copy(data, value);
435+
value.$q = q;
436+
value.$resolved = resolved;
421437
}
422438
}
423439
(success||noop)(value, response.headers);
424440
}, error);
425441

426442
return value;
443+
427444
};
428445

429446

test/ngResource/resourceSpec.js

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ describe("resource", function() {
264264
$httpBackend.expect('GET', '/CreditCard?key=value').respond([{id: 1}, {id: 2}]);
265265

266266
var ccs = CreditCard.query({key: 'value'}, callback);
267-
expect(ccs).toEqual([]);
267+
expect(ccs).toEqualData([]);
268268
expect(callback).not.toHaveBeenCalled();
269269

270270
$httpBackend.flush();
@@ -419,6 +419,53 @@ describe("resource", function() {
419419
expect(person.name).toEqual('misko');
420420
});
421421

422+
it("should have $q and $resolved properties for get", function () {
423+
$httpBackend.expect('GET', '/CreditCard/123').respond({id: 123, number: '9876'});
424+
var cc = CreditCard.get({id: 123}, callback);
425+
expect(cc.$q).toBeDefined();
426+
expect(typeof cc.$q).toBe('object');
427+
expect(cc.$resolved).toBeFalsy();
428+
$httpBackend.flush();
429+
expect(cc.$q).toBeDefined();
430+
expect(cc.$resolved).toBeTruthy();
431+
});
432+
433+
it("should have $q and $resolved properties for query", function() {
434+
$httpBackend.expect('GET', '/CreditCard?key=value').respond([{id: 1}, {id: 2}]);
435+
436+
var ccs = CreditCard.query({key: 'value'}, callback);
437+
expect(ccs.$q).toBeDefined();
438+
expect(typeof ccs.$q).toBe('object');
439+
expect(ccs.$resolved).toBeFalsy();
440+
$httpBackend.flush();
441+
expect(ccs.$q).toBeDefined();
442+
expect(ccs.$resolved).toBeTruthy();
443+
});
444+
445+
it("should have $q and $resolved properties for save", function() {
446+
$httpBackend.expect('POST', '/CreditCard/123', '{"id":{"key":123},"name":"misko"}').
447+
respond({id: {key: 123}, name: 'rama'});
448+
449+
var cc = CreditCard.save({id: {key: 123}, name: 'misko'}, callback);
450+
expect(cc.$q).toBeDefined();
451+
expect(typeof cc.$q).toBe('object');
452+
expect(cc.$resolved).toBeFalsy();
453+
$httpBackend.flush();
454+
expect(cc.$q).toBeDefined();
455+
expect(cc.$resolved).toBeTruthy();
456+
});
457+
458+
it('should should have $q and $resolved properties for delete', function() {
459+
$httpBackend.expect('DELETE', '/CreditCard/123').respond({});
460+
var removed = CreditCard.remove({id:123}, callback);
461+
expect(removed.$q).toBeDefined();
462+
expect(typeof removed.$q).toBe('object');
463+
expect(removed.$resolved).toBeFalsy();
464+
$httpBackend.flush();
465+
expect(removed.$q).toBeDefined();
466+
expect(removed.$resolved).toBeTruthy();
467+
});
468+
422469

423470
describe('failure mode', function() {
424471
var ERROR_CODE = 500,

0 commit comments

Comments
 (0)