生命不息重构不止!

  上一篇写了一下我对ajax的再次封装的方法,收到了很多有价值的回复,比如有童鞋建议用$.extend,一开始还以为要做成插件呢,后来才知道,原来这个东东还可以实现合并。省着自己再去做判断了。

  还有童鞋说“要不要多加点传入参数”,这一下提醒我了,ajax有很多参数呀,常用的我考虑进来了,但是还有很多不常用的呢,如果需要的话怎么办?在看看我调用原生ajax的方式,kao,完全不支持增加其他参数吗,这怎么行,改一定要改。于是就改成了这样。

  

 //对ajax的封装 //最基础的一层封装
Nature.Ajax = function(ajaxInfo) { //定义默认值
//type: "GET", //访问方式:如果dataPata不为空,自动设置为POST;如果为空设置为GET。
//dataType: Nature.AjaxConfig.ajaxDataType, //数据类型:JSON、JSONP、text
//cache: true, //是否缓存,默认缓存
//urlPara: {},//url后面的参数。一定会加在url后面,不会加到form里。
//formData: {},//表单里的参数。如果dataType是JSON,一定加在form里,不会加在url后面;如果dataType是JSONP的话,只能加在url后面。
//url: //依靠上层指定 //补全ajaxInfo
//dataType
if (typeof ajaxInfo.dataType == "undefined") ajaxInfo.dataType = Nature.AjaxConfig.ajaxDataType;
//cache
if (typeof ajaxInfo.cache == "undefined") ajaxInfo.cache = false; //type
if (typeof ajaxInfo.formData == "undefined") {
ajaxInfo.type = "GET";
} else {
ajaxInfo.type = "POST";
ajaxInfo.data = ajaxInfo.formData;
} //处理URL和参数
if (typeof ajaxInfo.urlPara != "undefined") {
var tmpUrlPara = "";
var para = ajaxInfo.urlPara;
for (var key in para) {
tmpUrlPara += "&" + key + "=" + para[key];
} if (ajaxInfo.url.indexOf('?') >= 0) {
//原地址有参数,直接加
ajaxInfo.url += tmpUrlPara;
} else {
//原地址没有参数,变成?再加
ajaxInfo.url += tmpUrlPara.replace('&', '?');
}
} //处理xhrFields
if (typeof ajaxInfo.xhrFields == "undefined") {
ajaxInfo.xhrFields = {
//允许cors跨域访问时添加cookie
withCredentials: true
};
} else {
if (typeof ajaxInfo.xhrFields.withCredentials == "undefined") {
ajaxInfo.xhrFields.withCredentials = true;
}
} //处理error
var error = ajaxInfo.error;
ajaxInfo.error = function(request, textStatus, errorThrown) {
//访问失败,自动停止加载动画,并且给出提示
alert("提交" + ajaxInfo.title + "的时候发生错误!");
if (typeof top.spinStop != "undefined")
top.spinStop();
if (typeof error == "function") error();
}; //处理success
var success = ajaxInfo.success;
ajaxInfo.success = function(data) {
//显示调试信息
if (typeof(parent.DebugSet) != "undefined")
parent.DebugSet(data.debug); if (typeof(ajaxInfo.ctrlId) == "undefined")
success(data);
else {
success(ajaxInfo.ctrlId, data);
}
}; //开始执行ajax
$.ajax(ajaxInfo);
};

  虽然还是只有一个参数,但是这个参数是一个集合。可以包含很多的元素(属性)。改进后完全以这个参数为主,进行默认的属性设置,最后直接把这个参数传递给原生ajax,这样调用的时候,可以根据ajax的规则来设定自己需要的属性了。

  另外去掉了  defaultInfo。因为看来看去,就是一个Nature.sendDataType 算是默认值,其他的都不算了。所以干脆去掉吧。改进后既可以很方便的调用,也确保了其扩展性,可以增加其他的属性。

  

 var ajax = Nature.Ajax; 

 ajax({
url:"",
formData: jsonValue,
urlPara: ajaxUrlPara,
title: "保存数据",
success: function(data) {
if (data.err.length == 0) {
alert("保存成功!");
//清空表单 } else {
alert(data.err);
} if (typeof callback == "function") {
callback();
} }
});

  好像还是要写不少东东,但是仔细看看的话,可以发现有很多优势,首先明确了哪些参数用url传递,哪些参数用表单post传递。error有了统一的处理,苏测试时success了也可以统一显示调试信息。不用去考虑是post还是get是json还是jsonp,这些都会统一处理。

  

  最后涉及到了一个并发的问题,因为我想实现“复用”,这个函数会被加载到top页面里,其他的子页面都会到top里调用这个函数,那么如果同时打开两个iframe,一起加载,并发了怎么办?会不会产生冲突?如果new的话,并发的时候肯定不会产生冲突,但是jQuery的ajax似乎没有new,那么他是如何处理并发的呢?

  我是实践派,遇到问题了首先想到的是写点代码测试一下,然后再去找找原理和理论。于是我就写了个代码模拟测试一下,看看并发的情况。

  

  var state = 1;

         function fun1(para, timestep) {
var temp = para.a1;//内部变量 para.a1 = para.a1 * 100;//修改参数看看 this.time = timestep;//这个不new的时候能用吗? var self = this;//setTimeout里面用不了这个this,那么江湖规矩。 state ++;//全局变量,不解释 window.setTimeout(function() { //模拟回调
console.log(para.name);
console.log("para.a1 : " + para.a1);
console.log("temp:" + temp);
console.log("this.time: " + self.time); },timestep);
} fun1({ name: "aa1",a1:10 }, 1000);
fun1({ name: "aa2", a1: 20 }, 100); var f1 = new fun1({ name: "aa3", a1: 30 }, 10);

大家猜猜输出结果是啥?

ajax的再次封装!(改进版) —— new与不 new 有啥区别?的更多相关文章

  1. ajax的再次封装!

    js的动态加载.缓存.更新以及复用 系列有点卡文,放心会继续的.先来点更基础的,为js的加载做点铺垫. jQuery的ajax本来就很方便了,为啥还要在进一步的封装呢?这个首先要看项目的具体需求了,如 ...

  2. jquery ajax的再次封装,简化操作

    1.封装的ajax var funUrl=""   // 每个请求地址相同的部分 function queryData(url,params,success,error){ url ...

  3. JS弹出框插件zDialog再次封装

    zDialog插件网址:http://www.jq22.com/jquery-info2426 再次封装zDialog的代码: (function ($) { $.extend({ iDialog: ...

  4. easyui的window插件再次封装

    easyui的window插件再次封装 说明:该插件弹出的弹出框在最顶层的页面中,而不是在当前页面所在的iframe中,它的可拖动范围是整个浏览器窗口:所以不能用JS的parent对象获取弹出它的父页 ...

  5. Ajax基础之封装3

    今天接着我们上篇博文的栗子,现在我来扩大一下需求,之前是点击按钮取出新闻,现在要实现每隔一段事件进行新闻的更新.这个时候,肯定是加一个定时器,然后每隔一段事件,再进行一次Ajax请求,既然要经常用到A ...

  6. javascript笔记——jqGrid再次封装

    xingrunzhao js插件再次封装 demo 'use strict'; /** * commerce grid框架 * 依赖jqgrid */ (function ($_self, jQuer ...

  7. jQuery Ajax 二次封装

    jQuery Ajax通用js封装 第一步:引入jQuery库 <script type="text/javascript" src="<%=path%> ...

  8. ajax二次封装之异步加载

    ajax二次封装之异步加载 ajax异步加载会导致在数据未加载回来就读取数据,然后出现数据为空的报错.在ajax封装时,将ajax直接改为同步,虽然可以解决报错,但是会导致页面渲染被阻塞,接口反应时间 ...

  9. 微信小程序request(ajax)接口请求封装

    微信小程序request(ajax)接口请求封装 最近在进行小程序的编写,需要调用后端接口,经常要用到wx.request方法,所以就自己封装了一下,简化一下代码,如果能给大家提供帮助更好,在封装的时 ...

随机推荐

  1. Oracle 11g系列:约束

    约束是每个数据库必不可少的一部分,约束的目的在于保存数据的完整性.数据完整性是指数据的精确性和可靠性.数据库约束主要包括:主键约束.外键约束.唯一性约束.检查约束和默认值约束. 1.主键约束 主键约束 ...

  2. WPF combobox

    先写一个数据类Grade.cs using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  3. CSS实现水平垂直同时居中的5种思路

    × 目录 [1]水平对齐+行高 [2]水平+垂直对齐 [3]margin+垂直对齐[4]absolute[5]flex 前面的话 水平居中和垂直居中已经单独介绍过,本文将介绍水平垂直同时居中的5种思路 ...

  4. 用实例讲解Spark Sreaming--转

    原文地址:http://www.infoq.com/cn/articles/spark-sreaming-practice 本篇文章用Spark Streaming +Hbase为列,Spark St ...

  5. php常见的面试题目

    一. 基本知识点1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302...200 : 请求成功,请求的数据随之返回.301 : 永久性重定向.302 ...

  6. 一步一步学Python(1) 基本逻辑控制举例和编码风格规范

    (1) 基本逻辑控制举例和编码风格规范 1.while死循环 2.for循环 3.if,elif,else分支判断 4.编码风格(官方建议) 版本:Python3.4 1.while死循环 #func ...

  7. Wee – 为现代 Web 开发打造的 CSS 脚手架

    Wee 包含许多开发人员在搭建响应的,互动的网站和应用程序时需要的组件.正如它的名字一样,Wee 是一个微小.移动优先的 CSS 复位框架.Wee 组织在一个简单的.可扩展的层次结构,拥有一致的样式和 ...

  8. WPF The Hard Way

    WPF The Hard Way Windows Presentation Foundation (WPF) 是微软下一代显示系统,用于生成能带给用户震撼视觉体验的 Windows 客户端应用程序.  ...

  9. Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具

    Android抓包方法(三) 之Win7笔记本Wifi热点+WireShark工具 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等 ...

  10. Windows Azure Platform Introduction (11) 了解Org ID、Windows Azure订阅、账户

    <Windows Azure Platform 系列文章目录> 了解和掌握Windows Azure相关的基础知识是非常重要的. 问题1:什么叫做Org ID Org ID是Azure C ...