javascript - AngularJS 最佳实践 - 具有多种方法的工厂

标签 javascript angularjs angularjs-factory

我有一个工厂,提供三种不同的 $http.get 方法。

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;
		},
	};
	});

基本上,这些方法仅在获取数据的路径上有所不同。这些方法获取的数据在 Controller 中处理。我在业余时间阅读了很多Angular 最佳实践,并且看到了 DRY(不要重复自己)提示。

我觉得上面的代码太重复了。有没有更好的Angular 方式编码方式?

**注意:我使用 yeoman 生成器来构建项目的目录。

最佳答案

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');
    }
    });

关于javascript - AngularJS 最佳实践 - 具有多种方法的工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33393436/

相关文章:

javascript - 为什么 jquery 选项选择不起作用

javascript - 刷新浏览器后,来自 Ajax 的 Listview 调用未更新

javascript - AngularJS - 工厂不工作/激活

javascript - 工厂方法引用混淆,以及编码指南

javascript - AngularJS : Factory and Service?

javascript - 将工厂注入(inject) Controller AngularJS + TypeScript

javascript - 更改宽度和高度 RegEx javascript

php - 随机版本号与图像强制缓存

javascript - AngularJS $compile 不会删除双 curl 表达式

javascript - 使用 Underscore/Lodash 将对象按值排序到 AngularJS ng-repeat 的对数组中