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 相关文章推荐
jquery HotKeys轻松搞定键盘事件代码
Aug 30 Javascript
JavaScript Event学习第十章 一些可替换的事件对
Feb 10 Javascript
基于MooTools的很有创意的滚动条时钟动画
Nov 14 Javascript
javascript之Partial Application学习
Jan 10 Javascript
JavaScript中string对象
Jun 12 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
Sep 19 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
Oct 14 Javascript
详解JavaScript的内置对象
Dec 07 Javascript
ECMAscript 变量作用域总结概括
Aug 18 Javascript
又拍云 Node.js 实现文件上传、删除功能
Oct 28 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
Oct 27 Javascript
vue的webcamjs集成方式
Nov 16 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
通过文字传递创建的图形按钮
2006/10/09 PHP
PHP简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
php empty函数判断mysql表单是否为空
2010/04/12 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
DHTML 中的绝对定位
2006/11/26 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
jquery分页插件jpaginate在IE中不兼容问题
2014/04/22 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
canvas 弹幕效果(实例分享)
2017/01/11 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
JavaScript Array对象基本方法详解
2019/09/03 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
市场拓展计划书
2014/05/03 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
keepalived + nginx 实现高可用方案
2022/12/24 Servers