2

I have a factory that serves up three different $http.get methods.

angular.module('myApp')
	.factory('getFactory', function ($http, $q) {

	return {

		methodOne: function () {
			var deferred  = $q.defer();

			$http.get('path/to/data')
				.then(function successCallback (data) {
    					deferred.resolve(data);
    				},function errorCallback (response) {
                                        console.log(response);
                                });

			return deferred.promise;
		},

		methodTwo: function (arg1, arg2) {
			var deferred  = $q.defer();

			$http.get('path/to/' + arg1 + '/some/' + arg2 + 'more/data')
				.then(function successCallback (data) {
    					deferred.resolve(data);
    				},function errorCallback (response) {
                                        console.log(response);
                                });

			return deferred.promise;
		},

		methodThree: function (arg1, arg2, arg3) {
			var deferred  = $q.defer();

			$http.get('path/to/' + arg1 + '/some/' + arg2 + '/more/' + arg3 + '/data')
				.then(function successCallback (data) {
    					deferred.resolve(data);
    				},function errorCallback (response) {
                                        console.log(response);
                                });

			return deferred.promise;
		},
	};
	});

Basically, these methods only differ in the path it gets the data from. The data these methods get are handled in the controller. I have been reading a lot of Angular best practices on the side and have been seeing DRY (Don't Repeat Yourself) tips.

I feel the code I have above is too repetitive. Is there a better way of coding this the Angular way?

**Note: I used the yeoman generator to scaffold the directories of my project.

2
  • 1
    AFAIK success and error are deprecated, and you should use then insetad. Commented Oct 28, 2015 at 14:18
  • @AlexanderBondar Thank you for that notice. I just read up on it now on the AngularJS $http documentation. Will edit code. Commented Oct 28, 2015 at 14:24

1 Answer 1

3
angular.module('myApp')
    .factory('getFactory', function ($http, $q) {

    //Using revealing Module pattern
    var exposedAPI = {
        methodOne: methodOne,
        methodTwo: methodTwo,
        methodThree: methodThree
    };

    return exposedAPI;

    //Private function, not required to be exposed
    function get(url){
        //$http itself returns a promise, so no need to explicitly create another deferred object
        return $http.get(url)
                .then(function (data) {
                    //Create deferred object only if you want to manipulate returned data
                }, function (msg, code) {                       
                    console.log(msg, code);
                });
    }

    function methodOne() {
        //DRY
        return get('path/to/data');
    }

    function methodTwo(arg1, arg2) {
        return get('path/to/' + arg1 + '/some/' + arg2 + 'more/data');
    }

    function methodThree(arg1, arg2, arg3) {
        return get('path/to/' + arg1 + '/some/' + arg2 + '/more/' + arg3 + '/data');
    }
    });
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.