Angular网络请求的封装

很多时候,我很喜欢angular的编码风格,特别是angular支持typescript之后,完整的生命周期,完美的钩子函数,都是别的语言所无法替代的。
这里我来说说我自己的网络请求封装,某种意义上来说,angular自己的网络请求封装的很好的,我们没有必要再来画蛇添足,但是,可能是我有那么一点点的代码洁癖吧,喜欢自己的风格样式,所以就有了这一点多余的东西。

Angular的网络请求

这里是angular自己的网络请求。

  • url代表网络请求地址,
  • param网络请求参数
  • 网络请求配置,例如:请求头等
this.http.post(url, param, config).subscribe((res) => {//...请求成功}, (err) => {//...请求失败}, () => {//...请求完成});

很多时候我觉得,每一次请求都要写上subscribe里面的那些参数,很麻烦,或者说看起来觉得不喜欢,所以,我一般给自己封装一个新的服务service。同时给每一个需要做网络请求的组件component实现一个新的接口interface,这里面有很多都是源自java语言的设计思想。

一个网络接口

这里创建一个网络接口,来完成网络请求的回调。


export interface OnHttpImp {onResult(result: HttpResult, code?: number): void;onError?(err:any): void;onComplete?(): void;
}export class HttpResult {code?: number;data?: any;msg?: string;
}

OnHttpImp 接口创建三个方法,分别是onResult,onError和onComplete,其中onComplete和onError是非必需实现的,onResult是必须实现的。这里的三个函数用来完成http的三个回调。

那么,上面的网络请求就可以移到新的服务CommonService里面,就会变成这样:

public post(url: string, param: FormData, callback: OnHttpImp, code?: number) {url = Config.base   url;const headers = new Headers();headers.append('Content-Type', 'application/x-www-form-urlencoded');this.http.post(url, param, {}).subscribe((res) => {if (code) {callback.onResult(res, code);} else {callback.onResult(res);}}, (err) => {console.log(url   '===>'   JSON.stringify(err));}, () => {if (callback.onComplete) {callback.onComplete();}});}

这里面的url和param就不用多解释了,callback就是一个OnHttpImp的实例,作用就是把网络请求返回的数据回调到对应的component里面,这样就可以是数据处理和网络请求相互分开。code是一个标识符,用来区分在一个组件里面发送多个请求时,实现数据的隔离。

HttpResult是一个网络请求返回数据的类,用来方便处理数据,可以适当根据自己的数据返回类型进行自定义封装。

调用的组件

先看代码:


export class LoginComponent implements OnInit, OnHttpImp {public validateForm: FormGroup;public username_control: AbstractControl;public password_control: AbstractControl;constructor(private fb: FormBuilder,private http: HttpUtil) {}ngOnInit() {this.validateForm = this.fb.group({'userName': [null, [Validators.required]],'password': [null, [Validators.required]],remember: [true],});this.username_control = this.validateForm.controls['userName'];this.password_control = this.validateForm.controls['password'];}_submitForm() {const params = new FormData();const md5 = new Md5();const password = md5.appendStr(this.password_control.value).end();params.set('username', this.username_control.value);params.set('password', password.toString());this.http.post('/user/login', params, this);}onResult(result: HttpResult, code?: number): void {//如果多个网络请求,需要传入code值,根据code值来判断请求来源//swthch(code){//    case 100://    //    break;//}// 如果单个请求,直接处理请求结果。// console.log(result)}}

上面的htpp请求传输的OnHttpImp对象是this,那么就说明LoginComponnt组件必须实现OnHttpImp接口,然后实现里面的函数onResult,onError和onComplete.

这样处理,就可以将http请求和,数据处理分开了,代码的可读性和简洁性都有大大的提升。

进一步的封装方式

  • 可以把上述里面component里面调用网络请求时传入的this,用一个统一的类MCallback来替代,统一处理返回的数据。
  • 可以把所有的网络请求统一放到一个服务里面,通过调用方法名来请求,这样可以实现多次网络请求的耦合,但是个人觉得有点过度封装了。

更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac安装了多版本php 卸载,mac 安装多版本PHP

前言相信大家在mac 安装PHP多版本的时候也遇到了很多坑# brew install php56# brew install php70这样安装的话肯定会报错的,因为brew存在软连接这个时候我们第一步:brew unlink php56 或者 brew unlink php70这个步骤是关闭掉PHP的软连接第二步&#x…

新国标电动自行车目录库

浙江:https://xzsp.zjidb.com/api/bicycle 上海:http://www.shbicycle.com/info.asp 北京:http://wfcxjk1.bjjtgl.gov.cn/fjdcml/fjdcListM.jsp 安徽:http://ddch.aqi.ah.cn/index_GB17761-1999.asp 3C查询:http://ccc…

HTML | CSS | JavaScript 常见错误

持续更新 超链接鼠标悬浮后的状态 a:hover 拼写图片文件的路径问题转载于:https://www.cnblogs.com/lcchy/p/10139389.html

隐藏的东西? 您需要HiddenSidesPane

我的甘特图用户之一希望在屏幕上使用尽可能多的空间,并询问是否可以删除滚动条。 但是,如何在没有滚动条的情况下进行导航? 好的,有各种各样的键盘快捷键,当然还有FlexGanttFX支持的普通鼠标拖动,但是大多数…

jQuery的on绑定click和直接绑定click区别

状况之外 在之前的公司并没有遇到这个问题,也就没有深究。直到自己换了现在的公司,刚来第二天就开始写别人写到一半的项目,很无奈,不是原生就是jquery,由于项目急,已经来不及切换框架重新布局,只…

php教程哪个软件好,写php用哪款软件好?解决方法

写php用哪款软件好?现在用php-eclipse,但是感觉不太好用js、html、css的提示功能没有,要装插件,装了很久没装上。想问一下现在开发php哪款软件好大家指导一下,谢谢------解决方案--------------------如果要js、html、…

循环数组对象 php,PHP循环遍历stdClass对象的数组

我有一个在MySQL中运行的查询,它返回一个结果作为stdClass对象,如下所示:array(8){[0]>object(stdClass)#36(1){["color"]>string(7)"#a0a0a0"}[1]>object(stdClass)#35(1){["color"]>string(7)"#e0e0e0"}[2]&…

js实现复制粘贴功能

在项目中使用到复制粘贴功能,虽然网上有很多大牛封装了很多的插件,但是还是想不去使用插件,就像自己来实现这个功能。 初步想法: 1. 获取到需要复制的内容,这里我可以将需要复制的内容放在input或者textarea的value中&…

Thymeleaf与Spring集成(第1部分)

1.引言 本文重点介绍如何将Thymeleaf与Spring框架集成。 这将使我们的MVC Web应用程序能够利用Thymeleaf HTML5模板引擎,而不会丢失任何Spring功能。 数据层使用Spring Data与mongoDB数据库进行交互。 该示例包含在酒店的单页Web应用程序中,从中我们可以…

html注释快捷键

1.选中需要注释的内容--->ctrlshift/ 2.取消注释--->ctrlshift\ 转载于:https://www.cnblogs.com/wyhluckdog/p/10131898.html

Java中转发(Forward)和重定向(Redirect)的区别

从URL来说,转发的地址栏没有发生改变,而重定向则是新的URL从数据共享来说,转发可以共享request域里面的数据,而重定向则不能。效率来说转发效率高,重定向效率低转发一般用来登陆后转发到对应模块, 重定向一…

oracle 老白,老白学编程 - Netdata学习 - numa

Numa 介绍NUMA,即Non-Uniform Memory Access Architecture,非统一内存访问架构。背景传统的SMP中, 所有处理器共享系统总线,当cpu数目增大时, 系统总现竞争就相应增加,会成为系统的瓶颈,所以SMP系统的CPU数…

几个非常实用的JQuery代码片段

jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多)。jQuery使用户能更方便地处理HTML(标准通用标记语言下的一个应用)、events、实现动画效果,并且方便地为网站提供AJAX交互。jQuery还有一…

编码的喜悦……以及Java中的变异测试

多年以来,为源代码编写单元测试一直是一种好习惯。 并且还可以使用测试覆盖率报告来查看测试覆盖了多少代码。 尽管行分支覆盖率报告非常有用,但是它并不能告诉您单元测试的实际效果。 因此,甚至在测试中没有一个断言的情况下,甚至…

错误1083:配置成在该可执行程序中运行的这个服务不能执行该服务 【解决办法】...

一直好用的服务程序,今天遇到这个问题,搜了一下各位给出的解决办法; 1.程序里多添加serviceInstaller组件的,然而我并没改代码,也没重新编译,不是解决我问题的办法; 2.修改注册表的,…

oracle 更改启动内存,Oracle 11gR2修改内存参数后无法启动问题

Microsoft Windows [版本 6.1.7600]版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\windows\system32>net start oracleserviceorclOracleServiceORCL 服务正在启动 ......OracleServiceORCL 服务已经启动成功。C:\windows\system32>sqlplus / as sysdbaSQL…

查看所有shell类型

[xfxuexi ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh 具体你使用的是那一个,取决于你的用户配置,可以在/etc/passwd文件查看最后一个字段 [xfxuexi ~]$ head -1 /etc/passwd…

Vue—事件修饰符

Vue事件修饰符 Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节&#xff0c;如&#xff1a; event.preventDefault() 或 event.stopPropagation()。Vue.js通过由点 (.) 表示的指令后缀来调用修饰符。 .stop.prevent.capture.self.once <!-- 阻止单击事件冒泡 -->…

如何安装 Angular CLI 并且检查 CLI 的版本

想在系统中安装 Angular CLI &#xff0c;如何进行安装并且如何检查 CLI 的版本&#xff1f; 可以使用命令&#xff1a; npm install -g angular/cli 进行安装。 使用命令 ng version 来查看 Angular 的 CLI 的版本 转载于:https://www.cnblogs.com/huyuchengus/p/10879166.htm…

与Maven和Docker的集成测试

Docker是其中的新热点之一。 与传统虚拟机相比&#xff0c;它具有一套不同的技术和思想&#xff0c;并通过容器的思想实现了相似但同时又有所不同的事物&#xff1a;几乎所有VM都具有强大的功能&#xff0c;但速度更快&#xff0c;并且具有非常有趣的附加功能。 在本文中&…