angularJS的公用代码Constant Service Factory

目录

App.js

Constant

Factory

Service


查看别人的业务代码想学习一下angularJS,随便打开一个js都是近千行代码,因为多人开发代码基本不复用,

但是实际上业务并不复杂。

简单学习下angularJS提取公共代码的一些方式。

App.js

在App.js的module定义之前,

可以加入一些简单的全局常量

或者Date.prototype.Format等简单的工具(日期格式化方法)

Constant

系统里面的常量可以使用Constant来提取出,这里用Constant来存一些系统的枚举常量

//存储本模块的枚举常量
module.constant("dmConstant",{
    //用户类型
    UserType:[
        {ID:1,Name:"个人"},
        {ID:1,Name:"机构"},
    ],
    //日志类型
    LogType:[
        {ID:1,Name:"登录日志"},
        {ID:2,Name:"退出日志"},
    ]
});

这样做的好处是枚举常量可以集中维护

不用每个页面进行维护,减少重复代码,枚举的常量有修改时不用修改多个文件。

Factory

一些最基础的方法可以放在Factory里,Factory可以注入到Service里面,

这样一个Factory的方法可以被多个Service复用

Factory可以定义一个对象,共享的类or方法,就是这个对象的属性,最后直接返回对象即可

这里我们用Factory来做一个接口管理的方法

module.factory('apiFactory', function ($http) {
    var apiFactory = {};
    //抽象接口方法GetPage
    apiFactory.getApiGetFunc = function (url) {
        return (params, func) => $http.get(url, { params: params }).then(({ data }) => {
            if (data.Success) {
                func(data);
            } else {
                layer.msg(data.ErrorMessage, { icon: 5 });
            }
        }, function ({ reason }) { });
    }
    //抽象接口方法Post
    apiFactory.getApiPostFunc = function (url) {
        return (params, func) => $http.post(url, params).then(({ data }) => {
            if (data.Success) {
                func(data);
            } else {
                layer.msg(data.ErrorMessage, { icon: 5 });
            }
        }, function ({ reason }) { });
    }
    return apiFactory;
});

Service

Service可以调用Factory,然后注入到Controller里面

所以Service这里主要用来直接提供具体业务用到的一些工具方法or接口方法

这里不贴工具类了,贴一个Service引用上面Factory来实现接口管理的服务

//集中管理XX模块的接口地址
module.service('dmApiService', ['apiFactory', function (apiFactory) {
    //===========================投诉管理 by XXXX=================================
    //get
    this.TypeListGet = apiFactory.getApiGetFunc("/api/DataDictionary/GetTypeList");//获取系统数据字典
    this.AllEmployeeListGet = apiFactory.getApiGetFunc("/api/Complain/GetEmployeeList");//获取所有员工下拉列表
}]);

Service直接管理接口地址,这样业务代码和接口地址解耦,接口地址集中管理,避免反复定义,集中维护

下面再贴一下注入Controller之后Controller如何调用

$scope.getEmployeeList = () => {
            dmApiService.AllEmployeeListGet({},
                (data) => {
                    $scope.employeeList = Array.isArray(data.ComplainEmployeeList) ? data.ComplainEmployeeList : []
                });
        }

然后需要使用接口的地方调用$scope.getEmployeeList()就可以了,大大减少了业务Controller层里面的业务代码,

当然不同公司web项目http请求的复用代码都不一样,我们只用修改factory里面的内容代码、入参等来满足业务即可

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在C语言中实现一个两部电梯公用控制系统的代码会比较复杂,涉及到多线程、队列以及状态管理等概念。这里我会提供一个简化版的伪代码概述,但请注意这不会是一个完整的可运行程序,因为完整代码需要考虑实际硬件接口、错误处理和用户交互界面: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> // 定义电梯状态 enum ElevatorState { IDLE, // 电梯闲置 MOVING_UP, // 电梯上行 MOVING_DOWN, // 电梯下行 STOPPED_AT_FLOOR // 电梯停在某层 }; // 电梯结构体 typedef struct { int elevatorId; enum ElevatorState state; sem_t floorRequest; // 请求信号量 sem_t elevatorDoor; // 电梯门信号量 } Elevator; // 电梯控制函数 void* elevatorControl(Elevator* e) { while (1) { // 获取请求并检查是否在当前楼层 sem_wait(&e->floorRequest); if (e->state == STOPPED_AT_FLOOR) { printf("Elevator %d is stopping at floor %d\n", e->elevatorId, e->currentFloor); sem_post(&e->elevatorDoor); // 打开电梯门 // 进行上下行操作... sem_post(&e->floorRequest); // 释放请求 } // 门关闭后继续等待下一个请求 sem_wait(&e->elevatorDoor); } } int main() { // 初始化电梯 Elevator elevator1 = {1, IDLE, SEMAPHORE_INIT(0), SEMAPHORE_INIT(1)}; Elevator elevator2 = {2, IDLE, SEMAPHORE_INIT(0), SEMAPHORE_INIT(1)}; // 创建电梯线程 pthread_t thread1, thread2; if (pthread_create(&thread1, NULL, elevatorControl, &elevator1)) { perror("Error creating thread 1"); return 1; } if (pthread_create(&thread2, NULL, elevatorControl, &elevator2)) { perror("Error creating thread 2"); return 1; } // 等待电梯线程结束 pthread_join(thread1, NULL); pthread_join(thread2, NULL); printf("Exiting...\n"); return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值