UNPKG

vesh-vj

Version:

VESH's JavaScript Framework

1,059 lines (1,058 loc) 65.7 kB
(function(V, $) { V.ni = {}; var N = V.ni; //依托Middler框架完成对数据类型文件的处理,包括ajax jsonp localStorage sessionStorage Sqlite ObjectDB(即自定义function) WebSocket等等数据源类型的操作 //实现对如下格式文件的处理 分别定义ajax /* Ni:{ ajaxtest2:{command:'http://localhost/VESHTest/Module/help/test.tjsonp?_n=recorder',dbtype:'tjson',params:{limit:11},template:'template1'}, ajaxtest1:{command:'http://localhost/KDAPI/Module/GetOrderTrackItems.tjsonp?_n=Order',dbtype:'tjson',params:{},template:'template1'}, 'ajaxtest1.Cache':{command:function(res,params){return res[params.cacheKey];不写即使用默认值},dbtype:'json',params:{},template:'template2'}, 'ajaxtest1.Set':{command:function(res,params){res[params.cacheKey] = params.cacheValue;不写即使用默认值},dbtype:'json',params:{timeout1:{interval:'s',number:50}},template:'template2'}, sqlinsert:{command:'create table if not exists table1(name Text,message text,time integer);insert into table1 values(?,?,?);',dbtype:'json',params:{data:[]},template:'sqltemp'}, sqlselect:{command:'select * from table1;',dbtype:'json',params:{data:[]},template:'sqltemp'}, sqlselect2:{command:'select * from table1 where name=?',dbtype:'json',params:{data:[]},template:'sqltemp'}, Name1:{command:'',params:{},dbtype:'json/tjson',template:'仅在Middler中调用NiMultiTemplateDecorator时启用'}, wstest1: { command: 'abc.json', dbtype: 'json', params: {}, template: 'ws' }, wstest2: { command: 'bcd.json?_n=MT, dbtype: 'json', params: {}, template: 'ws' } } */ /* var t = middler.getObjectByAppName('Ni','templatename'); var res = t.excute('aaa.GetProductDetail',{ProductID:111},function(result){ var res = result.last(); }); middler.setObjectByAppName('Ni','templatename',t); */ //分离NiDataConfig完成Ni格式文件处理 //分离NiDataConfigConvert完成对Ni格式转成Config //用于处理 Ni文件定义 { V.config.Configs = V.merge(V.config.Configs, { ConfigConverts: { Ni: { type: 'VJ.ni.NiDataConfigConvert' } } }); N.NiDataConfig = function() { var _ = this, __ = {}; { V.inherit.apply(_, [V.config.Config, []]); __.getValue = _.getValue; _.getValue = function() { var ret = __.getValue.apply(this, arguments); if (ret) { ret.merge = V.getValue(ret.merge, V.merge); } return ret; }; } }; N.NiDataConfigConvert = function() { var _ = this, __ = {}; { V.inherit.apply(_, [V.config.ConfigConvert, []]); } _.toConfig = function(val) { var ret = new N.NiDataConfig(); if (val) { if (typeof(val) == 'object') { for (var i in val) { if (val[i]) { ret.data[i] = VJ.merge({ params: {} }, val[i]); } } } } return ret; }; _.toStrings = function(config) { V.showException('VJ.ni.NiDataConfigConvert不支持此功能'); }; }; } //分离NiTemplate进行连续事务提交和顺序操作 { /** * * @param {数据源} res * @param {ni对象configManager对象} cm * @param {转换URL地址的后缀 默认'.tjson?_n=MT'} defExt */ N.NiTemplate = function(res, cm, defExt, merge) { var _ = this, __ = this; { _.lstCmd = []; _.KEY = 'Ni'; _.result = new N.NiDataResult(); _.transaction = false; _.res = res; _.cm = cm; _.defExt = defExt || '.tjson?_n=MT'; _.dbtype = _.defExt.split('?')[0].trim('.'); _.jsonp = _.dbtype.indexOf('p') >= 0 ? '_bk' : false; _.dbtype = _.dbtype.indexOf('tjson') >= 0 ? 'tjson' : 'json'; _.merge = merge || function() { var ret = VJ.merge.apply(this, arguments); //mysql特有 if (!ret.hasMarge && ret.PageIndex) { ret.hasMarge = true, ret.PageIndex = ret.PageIndex * ret.PageSize; } return ret; }; } }; N.NiTemplate.inherit2 = true; V.merge(N.NiTemplate.prototype, { _addCommand: function(name, params, func) { var _ = this; var cmd = _.cm.getConfigValue(_.KEY, name); if (cmd) { _.lstCmd.push(V.merge(cmd, { name: cmd.command, params: (cmd.merge || _.merge)(cmd.params, V.getValue(params, {})), func: func, key: name, jsonp: cmd.jsonp || _.jsonp, dbtype: cmd.dbtype || _.dbtype })); } else { //如果没有覆盖那么采用默认路径转换 _.lstCmd.push({ name: (name.indexOf('http') < 0 || name.startWith('/')) ? (name.replace(/[\.\/\\]/g, '/') + _.defExt) : (name || ''), params: _.merge(V.getValue(params, {})), func: func, key: name, jsonp: _.jsonp, dbtype: _.dbtype }) } }, _excute: function() { var _ = this, __ = this; var _cms = _.lstCmd; _.lstCmd = []; if (_cms.length > 0) { V.tryC(function() { var conn = _.res.getDBConnection(); if (_cms.length > 1) { conn.transaction = true; } var cmd = _.res.getDBCommand(); cmd.connection = conn; var i = 0; V.whileC2(function() { return _cms[i++]; }, function(v, next) { cmd.command = v.name; cmd.params = v.params; cmd.dbtype = v.dbtype; cmd.jsonp = v.jsonp; var _func = v.func; cmd.excute(_.result, function(data) { _.result.add((!data || (V.isArray(data) && data.length == 0)) ? false : data, v.key); V.tryC(function() { _func(_.result); }); next(); }); }, function() { if (conn.transaction && conn.commit) { conn.commit(); } _.res.backDBConnection(conn); }); }); } else { V.showException('不能调用空的命令对象!'); } return _.result; }, excute: function(name, params, func) { var _ = this; _._addCommand(name, params, func); if (!_.transaction) { _.commit(); } return _.result; }, commit: function() { var _ = this; return _._excute(); } }, true); N.NiTemplateManager = function(cm, appName) { var _ = this, __ = this; { _.KEY = V.getValue(appName, 'Ni'); __.middler = new V.middler.Middler(cm); } }; N.NiTemplateManager.prototype.excute = function(tempName, name, params, func) { var _ = this, __ = this; var temp = __.middler.getObjectByAppName(_.KEY, tempName); if (temp) { temp.excute(name, params, function(data) { V.tryC(function() { func(data); }); __.middler.setObjectByAppName(_.KEY, tempName, temp); }); } else { throw new Error('没有找到Template:' + tempName); } }; //获取json对象 使得不管json还是tjson都按照最终结果进行使用 //分离NiDataResult完成获取数据工作 N.NiDataResult = function() { var _ = this, __ = this; { __.data = {}; __.kv = {}; __.datas = []; } }; V.merge(N.NiDataResult.prototype, { get: function(key) { var _ = this, __ = this; return __.data[key] ? __.data[key] : __.kv[key] ? __.kv[key][1] : null; }, add: function(data, name) { var _ = this, __ = this; if (data && !__.kv[name]) { __.data[__.datas.length] = data; __.kv[name] = [__.datas.length, data]; __.datas.push(data); } else if (__.kv[name]) { var id = __.kv[name][0]; __.data[id] = data; __.kv[name] = [__.datas.length, data]; __.datas[id] = data; } }, single: function() { var _ = this, __ = this; return (_.hasData()) ? (function() { var data = _.get(__.datas.length - 1); return (data[0] && data[0][0]) ? data[0][0] : {}; })() : null; }, last: function() { var _ = this, __ = this; return _.get(__.datas.length - 1); }, each: function(key, func) { var _ = this, __ = this; var val = _.get(key); if (val && V.isArray(val)) { V.each(val, func); } }, clear: function() { var _ = this, __ = this; __.datas = []; __.data = {}; __.kv = {}; }, hasData: function(key) { var _ = this, __ = this; return key ? (function() { var v = _.get(key); if (v) { for (var k in v) return true; } return false; })() : (__.datas.length > 0 && (function() { var hasData = false; __.datas.forEach(function(v) { if (!hasData && v) { for (var k in v) hasData = true; } }); return hasData; })()); } }, true); } //分离NiDataResource完成static instance pool各种调用方式 { N.NiDataResource = function(factory, params) { var _ = this, __ = {}; { _.fac = factory; _.params = V.getValue(params, {}); } _.getDBConnection = function() { var conn = _.fac.createDBConnection(); conn.params = V.merge(conn.params, _.params); conn.params.resource = V.getValue(_.params.resource, conn.params.resource); if (!conn.isOpen) { conn.open(); } return conn; }; _.backDBConnection = function(conn) { _.fac.backDBConnection(conn); } _.getDBCommand = function() { return _.fac.createDBCommand(); } }; N.NiInstanceDataResource = function(factory, params) { var _ = this; { V.inherit.apply(_, [N.NiDataResource, [factory, params]]); } }; N.NiStaticDataResource = function(factory, params) { var _ = this, __ = {}; { __.conn = null; V.inherit.apply(_, [N.NiDataResource, [factory, params]]); __.getDBConnection = _.getDBConnection; } _.getDBConnection = function() { if (!__.conn) { __.conn = __.getDBConnection(); } return __.conn; }; _.backDBConnection = function(conn) { if (conn != __.conn) { if (conn.isOpen && conn.close) { conn.close(); } } }; }; N.NiPoolDataResource = function(factory, params, size) { var _ = this, __ = {}; { V.inherit.apply(_, [N.NiDataResource, [factory, params]]); __.getDBConnection = _.getDBConnection; size = V.getValue(size, 50); __.pool = new VJ.collection.Pool(size, function() { var conn = __.getDBConnection(); conn.dispose = conn.close; return conn; }); } _.getDBConnection = function() { var val = __.pool.getValue(); return val; }; _.backDBConnection = function(conn) { __.pool.setValue(conn); }; }; } //DataFactory常用基类 { N.NiDataFactory = function() { var _ = this, __ = {}; {} _.createDBConnection = function() { return new NiDataConnection(); }; _.createDBCommand = function() { return new N.NiDataCommand(); } _.backDBConnection = function(conn) { if (conn.isOpen) { conn.close(); } }; }; N.NiDataConnection = function() { var _ = this, __ = {}; { _.isOpen = false; _.params = {}; } _.open = function() { _.isOpen = true; }; _.close = function() { _.isOpen = false }; _.invoke = function(cmd, func) { func(false); }; }; N.NiDataCommand = function() { var _ = this, __ = {}; { _.connection = null; _.command = ''; _.params = { dbtype: 'json' }; } _.excute = function(result, func) { if (!_.connection || !_.connection.isOpen) { V.showException('数据库未连接'); if (func) { func(false); } return; } else { _.connection.invoke(_, function(data) { try { var hasFalse = false; switch (typeof(data)) { case "string": data = data.replace(/[\r\n]+/g, ''); if (data.startWith('{')) { _.dbtype = 'json'; data = '[[' + data + ']]' }; if (data.replace(/^(\[+\]+)/g, '').length === 0) { hasFalse = true; } else { hasFalse = (data.toLowerCase().indexOf('[false') >= 0 ? (data.toLowerCase().indexOf('[false:') >= 0 ? (function() { var _data = data.toLowerCase().match(/\[false:[^\]]+\]/g); if (_data && _data.length > 0) { return _data[0].substr(7, _data[0].length - 8); } else return true; })() : true) : false); } if (!hasFalse) { //如何判断tjson try { data = eval('(' + data.replace(/[\r\n]+/g, '') + ')'); } catch (e) { console.log(data); } } break; case "object": if (data) { $(data).each(function(i, v) { v = v + ''; hasFalse = (hasFalse || v == 'False' || v == 'false'); }); } else hasFalse = true; break; case 'undefined': default: V.showException('V.NiDataCommand success方法 name:typeof错误 type:' + data); hasFalse = true; break; } if (hasFalse) { data = (hasFalse == true ? false : hasFalse); } else { switch (_.dbtype) { default: case 'json': break; case 'tjson': data = V.evalTJson(data); break; } } if (func) { func(data); } } catch (e) { V.showException('V._ajaxOption success方法', e); if (func) { func(false); } } }); } }; }; } //NiTemplateDecorator NiMultiTemplateDecorator 装饰类 使得TemplateDecorator可以添加缓存,NiMultiTemplateDecorator可以根据Ni文件中定义的template进行操作 { N.NiTemplateDecorator = function(res, cacheres, cm, params, defExt, merge) { var _ = this, __ = this; { N.NiTemplate.apply(_, [res, cm, defExt, merge]); _.KEY = 'Ni'; _.lstCmd2 = {}; __.params = V.getValue(params, {}); _.cacheres = cacheres; } }; V.inherit2(N.NiTemplateDecorator, N.NiTemplate, { setCommand: function(res, params) { var _ = this, __ = this; params = V.merge(__.params, params); //兼容localStorage不可用的状态 try { if (res.setItem) { res.setItem(params.cacheKey, V.toJsonString({ data: params.cacheValue, date: (params.timeout ? new Date().add(params.timeout.interval, params.timeout.number).getTime() : false) })); } else { res[params.cacheKey] = V.toJsonString({ data: params.cacheValue, date: (params.timeout ? new Date().add(params.timeout.interval, params.timeout.number).getTime() : false) }); } } catch (error) { console.log('localStorage/sessionStorage可能不被支持或者跨域:' + e.message); } return null; }, //可以根据业务逻辑改为根据某个公共字段进行删除 clearCommand: function(res, params) { try { if (res.removeItem) { res.removeItem(params.cacheKey, null); } else if (res[params.cacheKey]) { delete res[params.cacheKey]; } return null; } catch (error) { console.log('localStorage/sessionStorage可能不被支持或者跨域:' + e.message); } }, cacheCommand: function(res, params) { try { var val = null; if (res.getItem) { val = V.json(res.getItem(params.cacheKey)); } else { if (res[params.cacheKey]) { val = V.json(res[params.cacheKey]); } } if (val) { if (val.date) { if (parseFloat(val.date) < new Date().getTime()) { delete res[params.cacheKey]; return null; } } return val.data; } else return null; } catch (error) { console.log('localStorage/sessionStorage可能不被支持或者跨域:' + e.message); } }, _addCommand: function(name, params, func) { var _ = this, __ = this; var index = _.lstCmd.length; N.NiTemplateDecorator._addCommand.apply(_, [name, params, func]); if (_.lstCmd.length != index) { var command = null; var cmd = _.cm.getConfigValue(_.KEY, name + '.Cache'); if (!cmd) { cmd = _.cm.getConfigValue(_.KEY, name + '.Clear'); if (cmd) { command = cmd.command || _.clearCommand; } } else { command = cmd.command || _.cacheCommand; } if (cmd) { _.lstCmd2[index] = { name: command, key: name, params: cmd.merge(_.lstCmd[_.lstCmd.length - 1].params, { cacheKey: V.hash(name + '.Set.' + V.toJsonString(_.lstCmd[_.lstCmd.length - 1].params)) }) } } } }, _excute: function() { var _ = this, __ = this; var _cms = _.lstCmd; _.lstCmd = []; if (_cms.length > 0) { V.tryC(function() { var conn = _res.getDBConnection(); var cmd = _.res.getDBCommand(); cmd.connection = conn; var func = function(v, next) { cmd.command = v.name; cmd.params = v.params; cmd.dbtype = v.dbtype; cmd.jsonp = v.jsonp; var _func = v.func; cmd.excute(_.result, function(data) { V.tryC(function() { _.result.add(data ? data : false, v.key); if (_func) { V.tryC(function() { _func(_.result); }); } }); if (data && data.length > 0 && !(data.length == 1 && data[0].length == 0)) { //新增缓存 var _nicmd = cm.getConfigValue(_.KEY, v.key + '.Set'); if (_nicmd) { var _conn = _.cacheres.getDBConnection(); var _cmd = _.cacheres.getDBCommand(); _cmd.connection = _conn; _cmd.command = V.getValue(_nicmd.command, _.setCommand); _cmd.params = _nicmd.merge(_nicmd.params, cmd.params, { cacheKey: V.hash(v.key + '.Set.' + V.toJsonString(cmd.params)), cacheValue: data }); _cmd.excute(_.result, function(data) { V.tryC(function() { _.cacheres.backDBConnection(_conn); }); }); } } i++; next(); }); }; var i = 0; V.whileC2(function() { return _cms.shift(); }, function(v, next) { var _nicmd = _.lstCmd2[i]; //准备处理缓存 if (_nicmd) { i++; var _conn = _.cacheres.getDBConnection(); var _cmd = _.cacheres.getDBCommand(); _cmd.connection = _conn; _cmd.command = _nicmd.name; _cmd.params = V.merge(_nicmd.params, v.params); _cmd.excute(_.result, function(data) { V.tryC(function() { try { _.cacheres.backDBConnection(_conn); } catch (e) {} if (data) { _.result.add(data, v.key); if (v.func) { V.tryC(function() { v.func(_.result); }); } next(); } else { func(v, next); } }); }); } else { i++; func(v, next); } }, function() { _.res.backDBConnection(conn); }); }); } else { V.showException('不能调用空的命令对象!'); } return _.result; } }); /** * 使用一致的缓存命令和设置命令 继承自NiTemplateDecorator * @param {*} res * @param {*} cacheres * @param {*} cm * @param {*} params * @param {*} defExt * @param {*} merge * @param {*} cachecommand * @param {*} setcommand */ N.NiTemplateCacheDecorator = function(res, cacheres, cm, params, defExt, merge, cachecommand, setcommand) { N.NiTemplateDecorator.apply(_, [res, cacheres, cm, defExt, merge]); _.cachecommand = cachecommand; _.setcommand = setcommand; }; V.inherit2(N.NiTemplateCacheDecorator, N.NiTemplateDecorator, { _addCommand: function(name, params, func) { var _ = this, __ = this; var index = _.lstCmd.length; N.NiTemplate._addCommand.apply(_, [name, params, func]); if (_.lstCmd.length != index) { var command = null; var cmd = _.cm.getConfigValue(_.KEY, _.cachecommand); if (cmd) { command = cmd.command || _.cacheCommand; _.lstCmd2[index] = { name: command, key: name, params: cmd.merge(_.lstCmd[_.lstCmd.length - 1].params, { cacheKey: V.hash(name + '.Set.' + V.toJsonString(_.lstCmd[_.lstCmd.length - 1].params)) }) } } } }, _excute: function() { var _ = this, __ = this; var _cms = _.lstCmd; _.lstCmd = []; if (_cms.length > 0) { V.tryC(function() { var conn = _res.getDBConnection(); var cmd = _.res.getDBCommand(); cmd.connection = conn; var func = function(v, next) { cmd.command = v.name; cmd.params = v.params; cmd.dbtype = v.dbtype; cmd.jsonp = v.jsonp; var _func = v.func; cmd.excute(_.result, function(data) { V.tryC(function() { _.result.add(data ? data : false, v.key); if (_func) { V.tryC(function() { _func(_.result); }); } }); if (data && data.length > 0 && !(data.length == 1 && data[0].length == 0)) { //新增缓存 var _nicmd = cm.getConfigValue(_.KEY, _.setcommand); if (_nicmd) { var _conn = _.cacheres.getDBConnection(); var _cmd = _.cacheres.getDBCommand(); _cmd.connection = _conn; _cmd.command = V.getValue(_nicmd.command, _.setCommand); _cmd.params = _nicmd.merge(_nicmd.params, cmd.params, { cacheKey: V.hash(v.key + '.Set.' + V.toJsonString(cmd.params)), cacheValue: data }); _cmd.excute(_.result, function(data) { V.tryC(function() { _.cacheres.backDBConnection(_conn); }); }); } } i++; next(); }); }; var i = 0; V.whileC2(function() { return _cms.shift(); }, function(v, next) { var _nicmd = _.lstCmd2[i]; //准备处理缓存 if (_nicmd) { i++; var _conn = _.cacheres.getDBConnection(); var _cmd = _.cacheres.getDBCommand(); _cmd.connection = _conn; _cmd.command = _nicmd.name; _cmd.params = V.merge(_nicmd.params, v.params); _cmd.excute(_.result, function(data) { V.tryC(function() { try { _.cacheres.backDBConnection(_conn); } catch (e) {} if (data) { _.result.add(data, v.key); if (v.func) { V.tryC(function() { v.func(_.result); }); } next(); } else { func(v, next); } }); }); } else { i++; func(v, next); } }, function() { _.res.backDBConnection(conn); }); }); } else { V.showException('不能调用空的命令对象!'); } return _.result; } }); //用于先读取缓存同步请求真实数据的情况 N.NiLazyTemplateDecorator = function(res, cacheres, cm, params, defExt, merge) { var _ = this, __ = this; { __.lazyExp = V.getValue(params.lazyExp, function(p) { return true; }); params = V.merge({}, params); if (params && params.lazyExp) { delete params.lazyExp; } N.NiTemplateDecorator.apply(_, [res, cacheres, cm, params, defExt, merge]); } }; V.inherit2(N.NiLazyTemplateDecorator, N.NiTemplateDecorator, { _excute: function() { var _ = this, __ = this; var _cms = _.lstCmd; _.lstCmd = []; if (_cms.length > 0) { V.tryC(function() { var conn = _.res.getDBConnection(); var cmd = _.res.getDBCommand(); cmd.connection = conn; var i = 0; var func = function(v) { cmd.command = v.name; cmd.params = v.params; cmd.dbtype = v.dbtype; cmd.jsonp = v.jsonp; var _func = v.func; cmd.excute(_.result, function(data) { V.tryC(function() { if (!data) { data = false; } _.result.add(data, v.key); if (_func) { V.tryC(function() { _func(_.result); }); } }); if (data && data.length > 0 && !(data.length == 1 && data[0].length == 0) && __.lazyExp(v.params)) { //新增缓存 var _nicmd = _.cm.getConfigValue(_.KEY, v.key + '.Set'); if (_nicmd) { var _conn = _.cacheres.getDBConnection(); var _cmd = _.cacheres.getDBCommand(); _cmd.connection = _conn; _cmd.command = V.getValue(_nicmd.command, _.setCommand); _cmd.params = _nicmd.merge(_nicmd.params, cmd.params, { cacheKey: V.hash(v.key + '.Set.' + V.toJsonString(cmd.params)), cacheValue: data }); _cmd.excute(_.result, function(data) { V.tryC(function() { cacheres.backDBConnection(_conn); }); }); } } }); }; V.whileC2(function() { return _cms.shift(); }, function(v, next) { var _nicmd = _.lstCmd2[i]; //准备处理缓存 if (_nicmd && __.lazyExp(v.params)) { i++; var _conn = _.cacheres.getDBConnection(); var _cmd = _.cacheres.getDBCommand(); _cmd.connection = _conn; _cmd.command = _nicmd.name; _cmd.params = V.merge(_nicmd.params, v.params); _cmd.excute(_.result, function(data) { V.tryC(function() { try { _.cacheres.backDBConnection(_conn); } catch (e) {} if (!data) { data = false; } if (data) { _.result.add(data, v.key); if (v.func) { V.tryC(function() { v.func(_.result); }); } } func(v, next); }); }); } else { i++; func(v, next); } }, function() { _.res.backDBConnection(conn); }); }); } else { V.showException('不能调用空的命令对象!'); } return _.result; } }); /** * 使用很多Template来完成相关操作,否则就使用默认值进行处理 * @param {真实数据源} res * @param {ni.js的ConfigManager} cm * @param {config.js的ConfigManager} relcm * @param {config.js的AppName} appName * @param {自动扩展后缀} defExt * @param {参数过滤方法} merge * @param {默认模板 如果不设置 那么使用真实数据源} template */ N.NiMultiTemplateDecorator = function(res, cm, relcm, appName, defExt, merge, template) { var _ = this, __ = this; { N.NiTemplate.apply(_, [res, cm, defExt, merge]); _.KEY = V.getValue(appName, 'Ni'); __.ni = new N.NiTemplateManager(relcm, _.KEY); //__._addCommand = _._addCommand; //__._excute = _._excute; __.lstCmd2 = {}; _.template = template || false; } }; V.inherit2(N.NiMultiTemplateDecorator, N.NiTemplate, { _addCommand: function(name, params, func) { var _ = this, __ = this; var index = _.lstCmd.length; N.NiMultiTemplateDecorator._addCommand.apply(_, [name, params, func]); if (_.lstCmd.length != index) { var cmd = _.lstCmd[_.lstCmd.length - 1]; cmd.template = cmd.template || _.template; if (cmd.template) { //调用templdate优先 复用其次 __.lstCmd2[index] = true; } } }, _excute: function() { var _ = this, __ = this; var _cms = _.lstCmd; _.lstCmd = []; if (_cms.length > 0) { V.tryC(function() { var conn = _.res.getDBConnection(); var cmd = _.res.getDBCommand(); cmd.connection = conn; var func = function(v, next) { cmd.command = v.name; cmd.params = v.params; cmd.dbtype = v.dbtype; cmd.jsonp = v.jsonp; var _func = v.func; cmd.excute(_.result, function(data) { V.tryC(function() { _.result.add(data ? data : false, v.key); if (_func) { _func(_.result); } }); next(); }); }; var i = 0; var _cms2 = __.lstCmd2; __.lstCmd2 = {}; V.whileC2(function() { return _cms.shift(); }, function(_v, next) { var v = _v; //准备处理缓存 if (_cms2[i]) { i++; __.ni.excute(v.template, v.key, v.params, function(result) { V.tryC(function() { _.result.add((result && result.get(v.key)) ? result.get(v.key) : [], v.key); v.func(_.result); }); next(); }); } else { i++; func(v, next); } }, function() { _.res.backDBConnection(conn); _cms2 = null; }); }); } else { V.showException('不能调用空的命令对象!'); } return _.result; } }) } //分离NiDBFactory产生NiDBConnection(Invoke) ajax localStorage sessionStorage js jsonp/getScript websocket Sqlite ObjectDB等各种资源 { //ajax jsonp/getScript 构造参数可修改ajax默认参数并新增host(../|http://www.abc.con)与dbtype(json/tjson)两个属性。 //默认dbtype为json js 建议static N.NiAjaxDataFactory = function() { var _ = this, __ = {}; { V.inherit.apply(_, [N.NiDataFactory, []]); __.AjaxConnection = function() { var _ = this, __ = {}; { V.inherit.apply(_, [N.NiDataConnection, []]); _.params = V.merge({ host: '', dbtype: 'json' }, _.params); } _.invoke = function(cmd, func) { V.ajax(V.merge(_.params, { url: ((cmd.command.indexOf('http:') >= 0 || cmd.command.indexOf('https:') >= 0) ? '' : _.params.host) + cmd.command, data: cmd.params, jsonp: cmd.jsonp, success: function(data, status) { try { if (func) { func(data); } } catch (e) { V.showException('V._ajaxOption success方法', e); } }, error: function(request, status, error) { V.showException('V._ajaxOption error方法 status:' + status, error); if (func) { func(false); } } })); } }; } _.createDBConnection = function() { return new __.AjaxConnection(); }; _.backDBConnection = function() { console.log('back conn'); }; }; //localStorage sessionStorage js ObjectDB N.NiObjectDataFactory = function() { var _ = this, __ = {}; { V.inherit.apply(_, [N.NiDataFactory, []]); __.ObjectConnection = function() { var _ = this, __ = {}; { V.inherit.apply(_, [N.NiDataConnection, []]); _.params = V.merge({ resource: {} }, _.params); __.open = _.open; __.close = _.close; } _.open = function() { switch (typeof(_.params.resource)) { case 'string': _.params.resource = eval('(' + _.params.resource + ')'); break; case 'object': if (V.isArray(_.params.resource)) { throw new Error('不能使用数组作为资源'); } break; default: throw new Error('N.NiObjectDataFactory 无法找到<' + _.params.resource + '>对象'); } __.open(); }; _.close = function() { if (_.params.resource) { delete _.params.resource; } __.close(); }; _.invoke = function(cmd, func) { //如何区分Insert还是select //针对 localStorage,sessionStorage,JS对象 function(res,params){res[params.key] = params.value; return 0;} //function(res,params){return res[params.key];} //function(res,p){return res.func(p);} try { var data = null; if (typeof(cmd.command) == 'function') { data = cmd.command(_.params.resource, cmd.params); } else { data = eval('(' + cmd.command + ')(_.params.resource,cmd.params)'); } if (typeof(data) == 'function') { V.tryC(function() { if (func) { data(func); } }); } else { V.tryC(function() { if (func) { func(data); } }); } } catch (e) { V.showException('V._ajaxOption success方法', e); if (func) { func(false); } } } }; } _.createDBConnection = function() { return new __.ObjectConnection(); }; }; //webSocket {url:''} totest N.NiSocketDataFactory = function() { var _ = this, __ = {}; { V.inherit.apply(_, [N.NiDataFactory, []]); var ws = window.WebSocket || window.MozWebSocket; if (!ws) { throw new Error(V.userAgent.name + '不支持WebSocket!'); } __.SocketConnection = function() { var _ = this, __ = {}; { V.inherit.apply(_, [N.NiDataConnection, []]); _.params = V.merge({ url: '', veshurl: '' }, _.params); __.open = _.open; __.close = _.close; __.conn = null; __.datas = []; __.senddatas = []; __.calls = {}; //处理接受 __.addData = function(data) { __.datas.push(data); __.callback(); }; __.callback = function() { if (__.datas.length > 0) { V.whileC(function() { return __.datas.shift(); }, function(val) { if (typeof(val) == 'string') { val = eval('(' + val + ')'); } if (val._id && val.response) { if (__.calls[val._id]) { __.calls[val._id].datas.push(val.response); } else { __.calls[val._id] = { datas: [], func: null, index: val._id }; __.calls[val._id].datas.push(val.response); } __.callfunc(val._id); } else { V.showException('未找到消息处理者' + V.toJsonString(val)); } return false; }); } }; __.callfunc = function(index) { var oCall = __.calls[index]; if (oCall && oCall.datas.length > 0 && oCall.func) { V.whileC(function() { return oCall.datas.shift(); }, function(val) { oCall.func(val, oCall.index); return false; }, function() { //delete __.calls[index]; }); } };