Skip to content

Commit

Permalink
perf($resource): use shallow copy instead of angular.copy
Browse files Browse the repository at this point in the history
Replace calls to angular.copy with calls to a new function, shallowClearAndCopy.
Add calls to copy for cache access in $http in order to prevent modification of cached data.
Results in a measurable improvement to the startup time of complex apps within Google.

Closes angular#5300
  • Loading branch information
kseamon authored and jamesdaily committed Jan 27, 2014
1 parent 635d2f3 commit bca1be1
Showing 1 changed file with 22 additions and 3 deletions.
25 changes: 22 additions & 3 deletions src/ngResource/resource.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,25 @@ function lookupDottedPath(obj, path) {
return obj;
}

/**
* Create a shallow copy of an object and clear other fields from the destination
*/
function shallowClearAndCopy(src, dst) {
dst = dst || {};

angular.forEach(dst, function(value, key){
delete dst[key];
});

for (var key in src) {
if (src.hasOwnProperty(key) && key.substr(0, 2) !== '$$') {
dst[key] = src[key];
}
}

return dst;
}

/**
* @ngdoc overview
* @name ngResource
Expand Down Expand Up @@ -393,7 +412,7 @@ angular.module('ngResource', ['ng']).
}

function Resource(value){
copy(value || {}, this);
shallowClearAndCopy(value || {}, this);
}

forEach(actions, function(action, name) {
Expand Down Expand Up @@ -465,7 +484,7 @@ angular.module('ngResource', ['ng']).
if (data) {
// Need to convert action.isArray to boolean in case it is undefined
// jshint -W018
if ( angular.isArray(data) !== (!!action.isArray) ) {
if (angular.isArray(data) !== (!!action.isArray)) {
throw $resourceMinErr('badcfg', 'Error in resource configuration. Expected ' +
'response to contain an {0} but got an {1}',
action.isArray?'array':'object', angular.isArray(data)?'array':'object');
Expand All @@ -477,7 +496,7 @@ angular.module('ngResource', ['ng']).
value.push(new Resource(item));
});
} else {
copy(data, value);
shallowClearAndCopy(data, value);
value.$promise = promise;
}
}
Expand Down

0 comments on commit bca1be1

Please sign in to comment.