Source: data/Cache.js

/**
 * Created by seeker910 on 2017/4/22.
 * @description 内存缓存
 * @description 动态缓存,缓存时间在关闭页面前始终有效
 * @description 对象在缓存中,则在缓存中获取,
 * @description 对象不在缓存中,则向服务端请求获取,并在获取后存入缓存中。
 */
Rsd.define('Rsd.data.Cache', {
    extend: 'Rsd.common.Object',
    xtype: 'cache',
    /*
     数据源代理 
     可以是Rsd.common.Service,也可以是用于创建Rsd.common.Service的参数config对象{}
     * */
    proxy:{},
    /**
     * 缓存方式:memory,application,
     * @param {*} config 
     */
    //cacheType:'',
    //cacheType == memory  时,数据存储容器
    //container:'',
    /*
     * */
    constructor: function Store(config) {
        config = config || {};
        this.apply(config);
        if(!Rsd.isObject(this.container ))
        {
            this.container={};
        }
    },
    /**
     * @description 用于动态【逐条】加载缓存数据
     * @param {*} args 
     * @param {*} callback 
     */
    load:function load(args,callback)
    {
        var me = this;
        var _args = args || {};
        if(Rsd.isEmpty(me.keyName))
        {
            Rsd.error("Rsd.data.Cache对象未设置keyName属性,数据无法被缓存。");
        }
        var _callback = function _cache_callback(resp)
        {
            //debugger;
            if(resp.success)
            {
                var data = resp.data;
                var list=[];
                var key = data[me.keyName]
                if(Rsd.isEmpty(key))
                {
                    Rsd.error("对象"+me.keyName+"属性值为空,数据无法被缓存。");
                }
                else
                {
                    if(me.container[key]){ 
                        me.container[key].data = data||{};
                        list =  me.container[key].callbacks||[];
                    }else
                    {
                        me.container[key] = {data:data,callbacks:[]};
                    }
        
                    for(var i in list)
                    {
                        Rsd.callFunction(me,list[i],[data]);
                    }
                    //处理请求结束回调
                    if(callback)
                    {
                        Rsd.callFunction(me,callback,[data]);
                    }
                }
                
            }
           
        }

        me.proxy = me.proxy || {};
        // debugger;
        if(me.proxy instanceof Rsd.data.Service){
            me.proxy.request(_args,_callback);
        }
        else
        {
            me.proxy.url = me.proxy.url || me.url;

            Rsd.httpRequest(me.proxy ,_args,_callback);
        }
    },
    /**
    * @prama args 必须包含keyName对映字段。
    * */
    get:function get(key,callback) {

        var me = this;
        
        if(key == undefined || key == null || key == ""  )
        {
            throw new Error("参数key值无效:不允许为空。");
        }
       
        //debugger;
        if(this.container.hasOwnProperty(key))
        {
            if(this.container[key].data)
            { 
                Rsd.callFunction(this,callback,[this.container[key].data]);
            }
            else
            {
                this.container[key].callbacks.push(callback);
            }

        }
        else
        { 
            this.container[key] = {callbacks:[],data:null};
            //对象不存在时 注册回调方法,在获取到数据时再次回调
            this.container[key].callbacks.push(callback); 
        }

    },
    /**
    * */
    clear:function () {
        this.container={};
    },
    /**
    * */
    remove:function (key) {
        delete  this.container[key];
    }

},function (type) {
    
    //存储容器
    var _containerGetter = function () {

        if (!this.hasOwnProperty('__container')) {
            this.__container = {};
        }
        return this.__container;
    };
    var _containerSetter = function (value) {
        if(Rsd.isObject(value))
        {
            this.__container = this.__container||{};
            Rsd.apply(this.__container,value);
        }
    };
    this.defineProperty(type,"container", _containerGetter, _containerSetter,true);

    //缓存方式
    var _cacheTypeGetter = function () {

        if (!this.hasOwnProperty('__cacheType')) {
            this.__cacheType = 'memory';
        }
        return this.__cacheType;
    };

    var _cacheTypeSetter = function (value) {
        this.__cacheType =value;
    };
    this.defineProperty(type,"cacheType", _cacheTypeGetter, _cacheTypeSetter,true);
});