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


Posted in Javascript onMay 06, 2017

  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()的一次简单封装,虽然简陋,但是足以应付大多数情形,并且保留了更自由的处理方式,非常感谢和我一起讨论的朋友们,一起探讨这次的封装,收获很大,也希望对其他朋友所有帮助。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
javascript 命名规则 变量命名规则
Feb 25 Javascript
如何使Chrome控制台支持多行js模式——意外发现
Jun 13 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
Oct 25 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
Aug 13 Javascript
jQuery实现的多级下拉菜单效果代码
Aug 24 Javascript
JS实现左右无缝轮播图代码
May 01 Javascript
Bootstrap响应式侧边栏改进版
Sep 17 Javascript
seajs模块之间依赖的加载以及模块的执行
Oct 21 Javascript
vue + socket.io实现一个简易聊天室示例代码
Mar 06 Javascript
vue移动端UI框架实现QQ侧边菜单组件
Mar 09 Javascript
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
vue router的基本使用和配置教程
Nov 05 Javascript
JavaScript瀑布流布局实现代码
May 06 #Javascript
jquery点赞功能实现代码 点个赞吧!
May 29 #jQuery
jQuery extend()详解及简单实例
May 06 #jQuery
jquery仿微信聊天界面
May 06 #jQuery
Javascript实现页面滚动时导航智能定位
May 06 #Javascript
JavaScript实现打地鼠小游戏
Apr 23 #Javascript
简单实现jQuery弹幕效果
May 06 #jQuery
You might like
ThinkPHP php 框架学习笔记
2009/10/30 PHP
php中autoload的用法总结
2013/11/08 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
jquery实现输入框实时输入触发事件代码
2016/12/21 Javascript
vue观察模式浅析
2018/09/25 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
详谈Python中列表list,元祖tuple和numpy中的array区别
2018/04/18 Python
对python的文件内注释 help注释方法
2018/05/23 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
python excel和yaml文件的读取封装
2021/01/12 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
C和C++经典笔试题附答案解析
2014/08/18 面试题
《阳光》教学反思
2014/02/23 职场文书
投标单位介绍信
2015/05/05 职场文书
升学宴来宾致辞
2015/07/27 职场文书
2016年校长新年寄语
2015/08/17 职场文书
趣味运动会标语口号
2015/12/26 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书