示例#1
0
文件: model.js 项目: limu/magix
 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('&');
 },
示例#2
0
文件: mmanager.js 项目: limu/magix
    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;
        }
    },
示例#3
0
文件: mmanager.js 项目: limu/magix
    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;
    },