getParams: function(type) { var me = this; if (!type) { type = Model.GET; } else { type = type.toUpperCase(); } var k = '$' + type; var params = me[k]; var arr = []; var v; if (params) { for (var p in params) { v = params[p]; if (Magix.isArray(v)) { for (var i = 0; i < v.length; i++) { arr.push(p + '=' + Encode(v[i])); } } else { arr.push(p + '=' + Encode(v)); } } } return arr.join('&'); },
registerModels: function(models) { /* name:'', options:{ uri:'', jsonp:'true' }, urlParams:'', postParams:'', cacheTime:20000,//缓存多久 before:function(m){ }, after:function(m){ } */ var me = this; var metas = me.$mMetas; if (!Magix.isArray(models)) { models = [models]; } for (var i = 0, model, name; i < models.length; i++) { model = models[i]; name = model.name; if (model && !name) { throw Error('miss name attribute'); } else if (metas[name]) { throw Error('already exist:' + name); } if (model.cache) { if (!model.cacheKey) model.cacheKey = name; if (!model.cacheTime) model.cacheTime = DefaultCacheTime; } metas[name] = model; } },
send: function(models, done, flag, save) { var me = this; if (me.$doTask) { me.next(function() { this.send(models, done, flag, save); }); return me; } me.$doTask = true; var host = me.$host; var modelsCache = host.$mCache; var modelsCacheKeys = host.$mCacheKeys; var reqModels = me.$reqModels; if (!Magix.isArray(models)) { models = [models]; } var total = models.length; var current = 0; var hasError; var latestMsg; var currentError; var doneArr = new Array(total); var doneArgs = []; var errorArgs = {}; var orderlyArr = []; var doneIsArray = Magix.isArray(done); if (doneIsArray) { doneArgs = new Array(done.length); } var doneFn = function(model, idx, err) { if (me.$destroy) return; //销毁,啥也不做 current++; delete reqModels[model.id]; var mm = model.$mm; var cacheKey = mm.cacheKey; doneArr[idx] = model; if (err) { hasError = true; currentError = true; latestMsg = err; errorArgs.msg = err; errorArgs[idx] = err; } else { currentError = false; if (!cacheKey || (cacheKey && !modelsCache.has(cacheKey))) { if (cacheKey) { modelsCache.set(cacheKey, model); } mm.doneAt = Now(); var after = mm.after; var meta = mm.meta; if (after) { //有after SafeExec(after, [model, meta]); } host.fire('done', { model: mm, meta: meta }); } if (!model.fromCache && mm.used > 0) { model.fromCache = true; } mm.used++; } if (flag == FetchFlags.ONE) { //如果是其中一个成功,则每次成功回调一次 var m = doneIsArray ? done[idx] : done; if (m) { doneArgs[idx] = SafeExec(m, [currentError ? errorArgs : null, model, errorArgs], me); } } else if (flag == FetchFlags.ORDER) { //var m=doneIsArray?done[idx]:done; orderlyArr[idx] = { m: model, e: currentError, s: err }; // for (var i = orderlyArr.i || 0, t, d; t = orderlyArr[i]; i++) { d = doneIsArray ? done[i] : done; if (t.e) { errorArgs.msg = t.s; errorArgs[i] = t.s; } doneArgs[i] = SafeExec(d, [t.e ? errorArgs : null, t.m, errorArgs].concat(doneArgs), me); } orderlyArr.i = i; } if (current >= total) { if (!hasError) { errorArgs = null; } if (flag == FetchFlags.ALL) { doneArr.unshift(errorArgs); doneArgs[0] = errorArgs; doneArgs[1] = SafeExec(done, doneArr, me); } else { doneArgs.unshift(errorArgs); } me.$ntId = setTimeout(function() { //前面的任务可能从缓存中来,执行很快 me.doNext(doneArgs); }, 30); } }; for (var i = 0, model; i < models.length; i++) { model = models[i]; if (model) { var modelInfo = host.getModel(model, save); var cacheKey = modelInfo.cKey; var modelEntity = modelInfo.entity; var wrapDoneFn = WrapDone(doneFn, modelEntity, i); wrapDoneFn.id = me.id; if (cacheKey && Has(modelsCacheKeys, cacheKey)) { modelsCacheKeys[cacheKey].q.push(wrapDoneFn); } else { if (modelInfo.update) { reqModels[modelEntity.id] = modelEntity; if (cacheKey) { modelsCacheKeys[cacheKey] = { q: [wrapDoneFn], e: modelEntity }; wrapDoneFn = CacheDone; } modelEntity.request(wrapDoneFn, { key: cacheKey, cKeys: modelsCacheKeys }); } else { wrapDoneFn(); } } } else { throw Error('miss attrs:' + models); } } return me; },