define('ajax', ['zepto'], function ($) {
var cache = {};
/**
* @fileOverview 数据请求模块,用于ajax数据请求,此插件在zepto的ajax函数上封装了一些功能。根据后端返回的code代号或失败,在错误的code代码下将会在后台处理。<br>
* 注意此模块利用了zepto的`deferred`对象处理回调信息,请在实例化后利用`then`方法处理回调函数。<br>
* @module load
* @param {Object} config 配置请求参数
* @param {Boolean}[config.skipError] 默认为false,处理当请求出错时是否要交给deferred回调处理,当设置为false时交给模块内部处理,当设置为true时交给deferred回调处理
* @param {Boolean}[config.offAnimate] 默认为false,处理是否要打开加载动画
* @param {Boolean}[config.showShadow] 默认为false,处理是否现实遮罩图层
* @param {Boolean}[config.useCache] 默认为false,处理是否要缓存此次请求的结果
* @param {url} config.url 请求接口的url
* @param {type} config.type 设置是`POST`或`GET`方式请求
* @param {Object} config.data 发送给接口的数据
* @example 后端ajax接口同一的数据返回格式
* {
* code: 0 //默认0为成功,不等于0则表明异常
* msg: "" //当code不等于0时,将错误信息放到这里
* content: {} //接口所应该提供的数据内容
* }
* @example
* //先假设请求一个somehow.do参数返回以下数据:
* {
* code: 0,
* data: {
* newProject: true
* }
* }
* @example
* var load = new load();
* load({
* url: "somehow.do",
* type: "GET"
* }).then(function(result) {
* //如果后端返回的code等于0那么response里的content对象,否则此回调不会被执行
* console.log(result); //result == {newProject: true};
* });
* @example 如何处理错误信息
* //假设code不等于0而是任意数5(这取决于后端对错误code的定义),默认情况下是不会触发then函数里的回调 而是交给ajax模块内部处理。
* //设置skipError为true后,将会交给then函数处理错误信息。
* load({
* url: "somehow.do",
* type: "GET",
* skipeError: true
* }).then(function(result) {
* console.log(result); //result == {code:5, msg: "数据错误", content: {}};
* });
*/
var load = function (data) {
var param = _.extend({
skipError: false, //将错误信息交给回调执行
offAnimate: false, //关闭动画效果
showShadow: false, //显示动画遮罩层
useCache: false, //使用缓存数据
type: 'POST',
dataType: 'json'
}, data);
var skipError = param.skipError;
var offAnimate = param.offAnimate;
var showShadow = param.showShadow;
var useCache = param.useCache;
delete param.skipError;
delete param.offAnimate;
delete param.showShadow;
delete param.useCache;
var wait = function () {
var dtd = $.Deferred();
if (!useCache || (useCache && !cache[param.url])) {
$.ajax(param).then(function (result) {
if (result.code != '0' && !skipError) return dtd.reject(result.code, result.msg);
if (useCache) cache[param.url] = result;
dtd.resolve(skipError ? result : result.content);
}, function (result) {
if (confirm('网络异常请稍后重试!<br>(' + param.url + ')')) {
location.reload();
} else {
xjs.router.navigator('#home/');
}
});
} else {
var data = cache[param.url];
dtd.resolve(skipError ? data : data.content);
}
return dtd.promise();
};
return $.when(wait()).fail(function (code, error) {
alert(error);
});
};
return load;
});