Search code examples
angularjsangular-resource

Angular $resource - attach a generic .finally function to a method


I have a generic restful resource with angular's $resource. On any save method, I also want to set a message and boolean on whatever scope I'm in, and set a timeout for that message. So anywhere in my code where I call .save/.$save, I then attach a .finally onto it (below).

Rather than putting the same .finally onto every save I call, I'm wondering if I can just write a finally onto the actual resource itself, and have this be a generic finally for my save function.


var resource = $resource(
  pageListPath, 
  {}, 
  {
    query: {method:'GET', isArray:true},
    get: {method:'GET', url: pageDetailPath, params:{id:'@id'}, cache:true},
    save: {method:'PUT', url: pageSavePath, params:{id:'@id'}},
    delete: {method:'DELETE', url: pageDetailPath, params:{id:'@id'}}
  }
);

return resource;

    .finally(function() {
      $scope.loading = false;
      $timeout(function() {
        $scope.message = false;
      }, 2500);
    });

Ideally something like

save: {
  method:'PUT', 
  url:pageSavePath, 
  params:{id:'@id'}, 
  finally:function() { doStuff() }}

is what I'm looking for. Is this possible?


Solution

  • I ended up writing another service to encapsulate this one, providing generic functionality for certain responses.

    The API service:

    pageServices.factory('PageAPI',
      ['$resource', 
      function($resource,
        var resource = $resource(
          pageListPath, 
          {}, 
          {
            query: {
              method:'GET', 
              isArray:true
            },
            get: {
              method:'GET', 
              url: pageDetailPath, 
              params:{ id:'@id' }
            },
            ...,
            ...,
         }
        );
    
      return resource;
    
      }]
    );
    
    pageServices.factory('Page', ['PageAPI',
      function(PageAPI) {
        var service = {
          'getPages': function() {
            return PageAPI.query(function(response) {
              // Do stuff with success
            }, function(err) {
              // Handle error
            }).$promise.finally(function() {
              // Generic finally handler
            }
          },
          ...,
          ...,
        }
        return service
      }
    ])