AngularJS封装$http.post()实例详解

用了不是很长的时间跟了一个移动APP项目,用的是ionic + AngularJS + cordova框架,其间遇到过挺多问题,其中一个就是对Ajax的封装问题。
其实针对封装问题一直以来就没停止过谈论,不同的项目也有不同的需求,举个典型的例子,我在做这个项目的时候因为一开始没有考虑封装问题所以被批评了,而我的一个朋友却因为封装了受到了批评……很尴尬不是么。
那么对于是否要封装这个问题,究竟该怎么界定?其实这不是一个很复杂的问题,归根到底就是一个收益比率的问题,如果项目规模不是很大,那么过多考虑封装问题本身就没什么意义,对于项目的收益极低;而对于规模大的项目来说,如果不封装,那么潜在的风险就高得多,所以前期的投入也是值得的。
当然这个问题并不是我这样一个小白能掰扯清楚的事情,今天就来说说如果考虑封装的话,那么我会怎么处理。
angularjs中提供了一个服务http,它用来处理Ajax请求,这里我假设读者是了解angularjs的,所以直奔主题:对于post请求该如何处理封装。首先我需要确定一个事情,我能否排除所有使用者(项目团队成员)的个性化需求(需特殊处理的情况)。如果我不能,那么我该如果开放接口才能将post请求还原,所以我需要一个出口返回http.post()。
第二点,我需要考虑每一个使用者在应答到来时如何处理结果,针对success和error两种情况,我需要为他们提供一个处理逻辑的入口。
综合上面两点,我大概有了思路,我需要定义一个服务(公共服务),并且提供一个myPost方法,其中我允许使用者定义响应的回调,并且我允许他们取得更自由的处理方式,给他们一个原原本本的post()。好在js足够灵活,所以我可以这样来写:
service('myHttpService', ['$http', function ($http) {
var myHttpPost = function (url, data, successFn, errorFn) {
}
return {
myHttp: function (url, data, successFn, errorFn) {
return myHttpPost(url, data, successFn, errorFn);
}
}
}]);
如上,我会return内部定义的方法,这个方法允许使用者定义successFn和errorFn,即相应成功和失败的回调,如此一来使用者大可放心的预先编写数据的处理逻辑,而无需关心其他细节。
另外,我允许使用者拿到更加灵活的post(),那么我是这样实现的:
var httpPromise = $http.post(url, data, {timeout: 30000});
if (!angular.isDefined(successFn)) {
return httpPromise;
}
如果使用者并没有定义成功回调,好吧,这层封装就当是不存在,我会把post()丢出去,由调用者自行处理。而如果调用者想预先定义的话,我应当在封装中处理好他们的逻辑:
return httpPromise.then(
function (response) {
if (response.status) {
return successFn(response);
} else {
/*其他处理*/
}
},
function (error) {
if (!angular.isDefined(errorFn)) {
/*其他处理*/
} else {
return errorFn(error);
}
},
function () {
/*无论何总情况下都应该被执行的逻辑*/
}
)
如此对于http.post()的封装基本上就算是完成了。其中有一个地方需要注意,如果我在处理successFn的时候,用了angular.isDefined()判断调用者是否定义了回调,如果没有,我将把处理权利交给调用者,如果已定义我将代为处理。其中then()方法比较有趣,因为http方法返回的是一个promise对象,在响应返回的时候可以通过then()来处理响应,其实完全可以通过promise.success()和promise.error()来处理不同响应状态的回调,但是用then()更好一些,因为它接收到的是完整的响应对象,而success()和error()会对响应对象进行解析,具体的差别读者可以通过console输出来看看。
以上是我对$http.post()的一次简单封装,虽然简陋,但是足以应付大多数情形,并且保留了更自由的处理方式,非常感谢和我一起讨论的朋友们,一起探讨这次的封装,收获很大,也希望对其他朋友所有帮助。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# AngularJS
# $http.post()
# Angular
# JS
# $http.post()详细介绍
# 解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
# 对比分析AngularJS中的$http.post与jQuery.post的区别
# Angularjs中$http以post请求通过消息体传递参数的实现方法
# 后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
# AngularJS下$http服务Post方法传递json参数的实例
# AngularJS $http模块POST请求实现
# AngularJS $http post 传递参数数据的方法
# angularJS 发起$http.post和$http.get请求的实现方法
# 深入理解Angularjs中$http.post与$.post
# Angular利用HTTP POST下载流文件的步骤记录
# 的是
# 回调
# 可以通过
# 我在
# 我会
# 调用者
# 这个问题
# 就没
# 用了
# 提供一个
# 是一个
# 我是
# 他们的
# 也有
# 所以我
# 原原本本
# 和我
# 两种
# 我对
# 朋友们
相关文章:
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何通过.red域名打造高辨识度品牌网站?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何撰写建站申请书?关键要点有哪些?
如何在云指建站中生成FTP站点?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
建站之星安装后界面空白如何解决?
太原网站制作公司有哪些,网约车营运证查询官网?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
营销式网站制作方案,销售哪个网站招聘效果最好?
如何在香港服务器上快速搭建免备案网站?
微信小程序 input输入框控件详解及实例(多种示例)
如何快速打造个性化非模板自助建站?
专业网站建设制作报价,网页设计制作要考什么证?
如何在建站宝盒中设置产品搜索功能?
音乐网站服务器如何优化API响应速度?
宝塔新建站点报错如何解决?
制作网站怎么制作,*游戏网站怎么搭建?
淘宝制作网站有哪些,淘宝网官网主页?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
山东网站制作公司有哪些,山东大源集团官网?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
Thinkphp 中 distinct 的用法解析
设计网站制作公司有哪些,制作网页教程?
黑客如何通过漏洞一步步攻陷网站服务器?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
宿州网站制作公司兴策,安徽省低保查询网站?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
如何在IIS中新建站点并配置端口与IP地址?
如何在企业微信快速生成手机电脑官网?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
如何通过服务器快速搭建网站?完整步骤解析
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
网页设计网站制作软件,microsoft office哪个可以创建网页?
如何在自有机房高效搭建专业网站?
如何选择CMS系统实现快速建站与SEO优化?
如何用wdcp快速搭建高效网站?
重庆市网站制作公司,重庆招聘网站哪个好?
详解jQuery中基本的动画方法
如何用PHP快速搭建CMS系统?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
制作宣传网站的软件,小红书可以宣传网站吗?
*请认真填写需求信息,我们会在24小时内与您取得联系。