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 相关文章推荐
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
Dec 08 Javascript
Node.js实现批量去除BOM文件头
Dec 20 Javascript
jQuery实现本地预览上传图片功能
Jan 08 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
Dec 21 Javascript
javascript 闭包详解及简单实例应用
Dec 31 Javascript
javascript 组合按键事件监听实现代码
Feb 21 Javascript
各种选择框jQuery的选中方法(实例讲解)
Jun 27 jQuery
AngularJS基于http请求实现下载php生成的excel文件功能示例
Jan 23 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
Mar 10 Javascript
js实现文章目录索引导航(table of content)
May 10 Javascript
鸿蒙系统中的 JS 开发框架
Sep 18 Javascript
详细聊聊vue中组件的props属性
Nov 02 Vue.js
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
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
2015/12/24 PHP
php利用header函数下载各种文件
2016/08/24 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
php源码的使用方法讲解
2019/09/26 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
[00:14]护身甲盾
2019/03/06 DOTA
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
回调函数的意义以及python实现实例
2017/06/20 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Python编写一个优美的下载器
2018/04/15 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
2020/06/08 Python
Python计算信息熵实例
2020/06/18 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
优瑞自动咖啡机官网:Jura
2018/09/29 全球购物
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
我的动漫时代的创业计划书范文
2014/01/27 职场文书
《手指教学》反思
2014/02/14 职场文书
保护校园环境倡议书
2015/04/28 职场文书
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技