bmfe-vue2-base
Version:
BM 后台系统基础框架
193 lines (176 loc) • 4.78 kB
JavaScript
/**
* @Author: songqi
* @Date: 2016-06-29 22:06:00
* @Email: songqi@benmu-health.com
* @Last modified by: songqi
* @Last modified time: 2017-02-20
*/
var _ = require('lodash'),
Ajax = require('./ajax'),
Promise = Promise ? Promise : require('es6-promise').Promise;
var pathMap = {}, // 路径配置
ajaxMap = {}, // ajax 对象 map
paramMap = {}, // 请求参数 map
errorFunction, // 全局错误回调
successFuction; // 全局成功回调
/**
* [setConfig 初始化配置文件]
* @author songqi
* @date 2016-07-06
* @param {[Object]} options [配置选项]
*/
function setConfig(options){
if(_.isEmpty(options)){
return;
}
if(_.isPlainObject(options.pathMap)){
pathMap = options.pathMap;
}
if(_.isPlainObject(options.paramMap)){
paramMap = options.paramMap;
}
if(_.isFunction(options.errorFunction)){
errorFunction = options.errorFunction;
}
if(_.isFunction(options.successFuction)){
successFuction = options.successFuction;
}
}
/**
* [dealParam 处理传入的参数]
* @author songqi
* @date 2016-07-06
* @param {[String]} type [请求 method 类型]
* @param {[Object]} param [传入的参数]
* @return {[Object]} [参数列表]
*/
function dealParam(type, param){
if(!param.url){
return false;
}
param.url = pathMap[param.url] || param.url;
return _.assignIn(_.cloneDeep(paramMap[type] || {}), param);
}
/**
* [_abortAll abort 掉所有请求]
* @author songqi
* @date 2016-07-06
*/
function _abortAll(){
for(var i in ajaxMap){
_abortAjax(i);
}
}
/**
* [_abortAjax abort 某个确定的 ajax]
* @author songqi
* @date 2016-07-06
* @param {[String]} name [ajax id]
*/
function _abortAjax(name){
if(ajaxMap[name]){
ajaxMap[name].abort();
delete ajaxMap[name];
return;
}
if(_.isArray(name)){
names.map(function(item){
_abortAjax(item);
});
}
}
/**
* [bindVM 和 vue 进行绑定]
* @author songqi
* @date 2016-07-06
* @param {[Object]} vm [vue component]
* @param {[String]} times [ajax id]
*/
function bindVM(vm, times){
if(!vm._ajaxNames){
vm._ajaxNames = [];
var _destory = vm.$destroy;
vm.$destroy = function(){
_destory.apply(vm, arguments);
vm.abortAjax();
};
}
vm._ajaxNames.push(times);
vm.abortAjax = function(){
vm._ajaxNames.map(function(item){
_abortAjax(item);
});
};
}
/**
* [sendAjax 发送 ajax 请求]
* @author songqi
* @date 2016-07-06
* @param {[Sting]} type [发送类型]
* @param {[Object]} param [参数]
* @return {[Object]} [promise ajax]
*/
function sendAjax(type, param){
var _ajaxObj,
times = +new Date();
param = dealParam(type, param);
var _promiseAjax = new Promise(function(resolve, reject){
_ajaxObj = Ajax(_.assignIn({}, param, {
success: function(resData){
if(resData && resData.resCode === 0 && !_.isUndefined(resData.data)){
!param.noDefaultSuccess && successFuction && successFuction(resData);
resolve(resData);
}else{
resData.type = 'RE';
!param.noDefaultError && errorFunction && errorFunction(resData);
reject(resData);
}
},
error: function(err, type){
var resData = {
resCode: -1,
msg: '系统错误,请重试',
type: type,
errInfo: err
};
!param.noDefaultError && errorFunction && errorFunction(resData);
reject(resData);
},
complete: function(){
delete ajaxMap[times];
}
}));
});
// 和 vm 绑定
param.vm && bindVM(param.vm, times);
ajaxMap[times] = _ajaxObj;
_promiseAjax.name = times;
_promiseAjax.ajax = _ajaxObj;
return _promiseAjax;
}
/**
* [_post 对外提供的 post 方法]
* @author songqi
* @date 2016-07-06
* @param {[Object]} param [传入的参数]
* @return {[Object]} [Promise ajax]
*/
function _post(param){
return sendAjax('post', param);
}
/**
* [_get 对外提供的 post 方法]
* @author songqi
* @date 2016-07-06
* @param {[Object]} param [传入的参数]
* @return {[Object]} [Promise ajax]
*/
function _get(param) {
return sendAjax('get', param);
}
module.exports = {
get: _get,
post: _post,
abortAll: _abortAll,
setConfig: setConfig
};