首页 > 开发 > AJAX > 正文

详解二次封装jquery ajax的示例

2020-02-27 23:26:24
字体:
来源:转载
供稿:网友

在Web开发中,由于Ajax是本地刷新,因此后端的重定向是无效的,并且后端的权限控制需要Ajax页面的同步才能生效,下面是错新技术频道小编详解二次封装jquery ajax的示例,一起进入下文了解一下吧!

前言

Ajax 的全称是Asynchronous JavaScript and XML 异步的javaScript和XML

AJax所涉及到得技术:

       1.使用CSS和XHTML来表示。

       2. 使用DOM模型来交互和动态显示。

       3.使用XMLHttpRequest来和服务器进行异步通信。(核心)

       4.使用javascript来绑定和调用。

在我们前端处理数据的时候免不了要 ajax 与后台通信, ajax 是通过 XMLHttpRequest 对象与服务器进行通信的, jquery 在 XMLHttpReaquest 的基础上封装了 $.ajax 办法进行通信, $.ajax 办法实用性非常强,又非常简单易用。 本次二次封装 query ajax,参考 express 可以添加中间件处理数据,返回 Promise(Defferd) 对象,减少回调, 写 ajax 更加简洁、优雅。

$.ajax({ url: url, data: data, dataType: 'json', type: 'get', success: new Function(){}, error: new Function(){}, .......})

大部分的时候我们只需要传入 url 和 data, 就可以获取到我们想到的数据了。

痛点

但是在项目中使用 $.ajax, 它还是有一些痛点的

就是现在基本所有项目的 ajax 返回的数据也是进行了二次封装,加入了后台在处理业务逻辑时的信息。

从返回 data, 变成 了 {code: 200, data:{}, err_msg:''}

如果每一个 ajax 请求回来都要判断 code 是否正确再进行业务逻辑处理或者报错提醒, 整个项目下来也太冗余了,

$.ajax({ url: url, data: data, success: function(data){ if(data.code == 200) {  dosomething() } else { alert(data.err_msg); } }})

为了解决这个问题,我们用一个函数再次封装 $.ajax, 把这种正确与否判断再处理业务逻辑或者报错提醒提取出来做成公共的部分。

util.ajax = function(obj, successFn){ $.ajax({ url: obj.url || '/interface', data: obj.data || {}, dataType: obj.dataType || 'json', type: obj.type || 'get', success: function(data){  if (data.code != 200) {  alert(data.err_msg);  } else {  successFn(data.data)  } }, error: function(err){  alert(err) } })}

promise

util.ajax 代替 $.ajax 使用就可以减少了业务错误的判断啦。 我们再来完善下, 不使用回调的方式,使用 promise 的方式调用, 减少回调,让代码更清晰。

util.ajax = function(obj) { var deferred = $.Deferred(); $.ajax({  url: obj.url || '/interface',  data: obj.data || {},  dataType: obj.dataType || 'json',  type: obj.type || 'get', }).success(function (data) {  if (data.code != 200) {   deferred.reject(data.err_msg);  } else {   deferred.resolve(data.data)  } }).error(function (err) {  deferred.reject('接口出错,请重试'); }) return deferred.fail(function (err) {  alert(err) });}// 调用var obj = { url: '/interface', data: {  interface_name: 'name',  interface_params: JSON.stringify({}) }};util.ajax(obj) .done(function(data){  dosomething(data) })

中间件

这是一个公共的办法,但是有时候我们需要处理差异化啊, 我们参考 express 引入一个中间件来解决差异化问题。

util.ajax = function(obj, middleware) { var deferred = $.Deferred(); $.ajax({  url: obj.url || '/interface',  data: obj.data || {},  dataType: obj.dataType || 'json',  type: obj.type || 'get', }).success(function (data) {  if (data.code != 200) {   deferred.reject(data.err_msg);  } else {   deferred.resolve(data.data)  } }).error(function (err) {  deferred.reject('接口出错,请重试'); }) // 添加中间件 if(!middleware) {  middleware = function(){}; } return deferred.done(middleware).fail(function (err) {  message({   content: err,   type: 'error',   showLeftIcon: true,   duration: 5000  }); });}// 调用// 调用var obj = { url: '/interface', data: {  interface_name: 'name',  interface_params: JSON.stringify({}) }};var middleware = function(data) { data.forEach(function(item){  item.fullName = item.firstName + item.lastName })}util.ajax(obj, middleware) .done(function(data){  console.log(data.fullName) })

总结

以上是本文介绍的详解二次封装jquery ajax的示例内容,希望本文的内容能对大家的学习和工作有所帮助。如果您有任何问题,可以留言和交流。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表