Source: data/Service.js


/**
 * @desc 封装了本地(local)和远程(Server)两种请求,并自动匹配API 请求方法(GET,POST)
 * @copyright redmicro all Copyright (c)
 * @author Created by seeker910 on 14-3-17.
 * @memberof Rsd.data
 */
Rsd.define('Rsd.data.Service',{
    extend:'Rsd.common.Object',
    xtype:'service',
    name:'',
    text:'',
    isDemo:false,
    //server:{},
    //local:{},
    failureHandler:null,
    successHandler:null,
    errorHandler:null,
    completeHandler:null,
    /**
     * @constructs Rsd.data.Service
     * @classdesc Rsd.common.Service用于对业务接口的对象化管理,并且同时提供本地(local)和远程(Server)两种方式的请求;负责远程远程或本地服务调用;将远程服务与本地ajax请求逻辑合并封装
     *
     * @property  {string} extend Rsd.common.Object
     * @property  {string} xtype service
     * @property {string|function} failureHandler 服务请求业务处理失败时事件处理
     * @property {string|function} successHandler 服务请求业务处理成功时事件处理
     * @property {string|function} errorHandler 服务请求发生错误时事件处理
     * @property {string|function} completeHandler 服务请求完成事件处理
     * @property {object} local 格式:{ method:'get',url:''},
     * @property {object } server 格式:{ method:'get',url:''}
     * @property  {boolean} isDemo 是demo版本
     * @property  {string} name 英文名称
     * @property  {string} text 中文名称
     * * */
    constructor: function Service(config) {
        //debugger;
        config = config || {};
        this.apply(config);
    },
    /**
     *
     * @description 远程测试,支持批量数据测试
     * @function
     * @public
     * @memberof Rsd.data.Service
     * */
    testServer:function testServer(args){
        //debugger;
        var me =this;
        var _args =  args||me.args||[];
        if( _args.length == 0)
        {
            Rsd.debug('Testing:'+me.server.url);
            Rsd.httpRequest(this.server,{},function (data) {
                Rsd.log(data);
            });
        }
        else  {
            for(var data in _args) {
                Rsd.debug('Testing:'+me.server.url+";args:"+data);
                Rsd.httpRequest(me.server,data,null);
            }
        }
    },
    /**
     * @description 本地模拟数据测试
     * @function
     * @public
     * @memberof Rsd.data.Service
     * */
    testLocal:function testLocal()
    {
        Rsd.httpRequest(this.local,{},null);
    },

    /**
     * @private
     * @function
     * @memberof Rsd.data.Service
     * @description ajax 请求完成时执行
     * */
    complete:function complete(response)
    {
        if(Rsd.isFunction(this.completeHandler))
        {
            return this.completeHandler.call(this,response);
        }
        if(Rsd.isString(this.completeHandler)&& this.completeHandler !='')
        {
            return this.funApplyByIOC(this.completeHandler,arguments);
        }
        return true;
    },
    /** 
     * @private
     * @function
     * @memberof Rsd.data.Service
     * @description 业务逻辑成功:ajax请求成功,返回json数据中,success==true时执行
    * */
    success : function(response) {

        if (Rsd.isFunction(this.successHandler)) {
            return this.successHandler.call(this, response);
        }
        if (Rsd.isString(this.successHandler) && this.successHandler !='') {
            return this.funApplyByIOC(this.successHandler, arguments);
        }
        return true;
    },
    /**
     * @private
     * @function
     * @memberof Rsd.data.Service
     * @description 业务逻辑错误:ajax请求成功,返回json数据中,success==flase时执行
     * */
    failure:function failure(data)
    {
        if (Rsd.isFunction(this.failureHandler)) {
            return this.failureHandler.call(this, data);
        }
        if (Rsd.isString(this.failureHandler) && this.failureHandler !='') {
            return this.funApplyByIOC(this.failureHandler, arguments);
        }

        return true;
    },
    /**
     * @private
     * @function
     * @memberof Rsd.data.Service
     * @description ajax请求失败时执行,如:网络不通
     * */
    error:function error(xhr, textStatus, error){

        if(Rsd.isFunction(this.errorHandler))
        {
            return this.errorHandler.call(this,xhr, textStatus, error);
        }
        if(Rsd.isString(this.errorHandler)&& this.errorHandler !='')
        {
            return this.funApplyByIOC(this.errorHandler,arguments);
        }
        return true;
    },
     /**
     * @public
     * @function
     * @memberof Rsd.data.Service
     * @param {object} data 作为Ajax对象请求时的参数中data属性(即远程方法的参数)
     * @param {function} callback 优先执行callback,返回true时,后续方法(success,failure)继续执行,返回false时,后续方法终止。
     * @param {string} msg 提示信息
     * @param {number} timeout 超时时长(毫秒)
     * @param {object} routeArgs 路由参数
    * */
    request:function request(data,callback,msg,timeout,routeArgs) {
        data = data||{};
        var _routeArgs = {};
        var _timeout = null;
        var _msg = null;
        for(var i in arguments)
        {
            if(Rsd.isNumber(arguments[i]))
            {
                _timeout = arguments[i];
                continue;
            }
            if(Rsd.isString(arguments[i]))
            {
                _msg = msg;
                continue;
            }
            if(Rsd.isObject(arguments[i]))
            {
                _routeArgs = arguments[i];
                continue;
            }
        }
        var me = this; 
         //msg 提示信息 
         var _waitingId = null;

         if(_msg)
         {
           _waitingId = Rsd.showWaiting(me.id,Rsd,_msg);
           
           setTimeout(function(){
               Rsd.closeWaiting(_waitingId);
           },_timeout||1000);
 
         }
         //执行ajax 请求后回调方法
        var _callback=function(_data){
            //debugger; 
            var _b = true; 
            //优先执行callback
            if(_b && Rsd.isFunction(callback) )
            {
                _b = callback.call(me,_data);
            }
            if(_b == undefined )
            {
                _b = true;
            }
            if( _b == false || _b == 0 || _b < 0 || _b == null)
            {
                if(_waitingId)
                {
                    Rsd.closeWaiting(_waitingId);
                }
                return false;//后续方法不在执行
            }
            //处理对象 属性方法
            if(_data && !_data.success)
            {
                me.failure(_data);
            }
            else
            {
                me.success(_data);
            }

            if(_waitingId)
            {
                Rsd.closeWaiting(_waitingId);
            }
        };
         //debugger;
        if(this.isDemo){

            var _ajax = Rsd.create('Rsd.data.Ajax',Rsd.apply( {
                    token:Rsd.getAppToken(),
                    appId:Rsd.getAppId(),
                    authCode:Rsd.getAppAuthorization(),
                    jsonFormatter:Rsd.getAppConfig('jsonFormatter'),
                    complete:function _complete(){ if(_waitingId)Rsd.closeWaiting(_waitingId);me.complete.apply(me,arguments);},
                    error:function _error(){ if(_waitingId)Rsd.closeWaiting(_waitingId);me.error.apply(me,arguments);}
                },this.local));

            if(_timeout)
            { 
                _ajax.timeout = _timeout;
            }

            var _fn = function (_data) {
                var _name = Rsd.getUrlParam(_ajax.url,'name');
                _callback(_data[_name]); 
            }

            return _ajax.request(data,_fn);
        }
        else
        {
            //debugger;
            var _args = data;
            if(Rsd.isType(data,Object))
            {
                _args = {};
                _args = Rsd.apply(_args,this.server.data||{});
                _args = Rsd.apply(_args,data||{});
            }
             
            var _ajax = Rsd.create('Rsd.data.Ajax',Rsd.apply({
                    token:Rsd.getAppToken(),
                    appId:Rsd.getAppId(),
                    authCode:Rsd.getAppAuthorization(),
                    jsonFormatter:Rsd.getAppConfig('jsonFormatter'),
                    complete:function _complete(){ if(_waitingId)Rsd.closeWaiting(_waitingId);me.complete.apply(me,arguments);},
                    error:function _error(){ if(_waitingId)Rsd.closeWaiting(_waitingId);me.error.apply(me,arguments);}
                },this.server));
             
            if(_timeout)
            { 
                _ajax.timeout = _timeout;
            }
            //参数整理
            //替换路径参数 
            var _url = _ajax.url.toLowerCase(); 
            for(var s in _routeArgs)
            {
                if(Rsd.isString(s))
                {
                    if(_url.indexOf('{'+s.toLowerCase()+'}')>0)
                    {
                        _url = _url.replace('{'+s.toLowerCase()+'}',_routeArgs[s]); 
                        delete _args[s];
                    }
                   
                }
                
            } 
            //从环境变量中匹配路由参数
            if(Rsd.app)
            {
                
                for(var s in Rsd.app.globalVariables)
                { 
                    //console.log(s);
                    if(Rsd.isString(s))
                    {
                        if(_url.indexOf('{'+s.toLowerCase()+'}')>0)
                        {
                            _url = _url.replace('{'+s.toLowerCase()+'}',Rsd.app.globalVariables[s]); 
                        
                        } 
                    }
                }
               
            }            
                       
            _ajax.url = _url;
            if(me.progressHandler)
            {
                _ajax.on('progress',function (data) {

                    me.funApplyByIOC(me.progressHandler,arguments);
                });
            } 
           
            return _ajax.request(_args,_callback);
        }
    }

},function(type){

    var _localGetter = function () {

        if (this.__local == undefined) {
            this.__local = { method:'get',url:''};
        }
        return this.__local;
    };
    var _localSetter = function (local) {
        if(Rsd.isObject(local))
        {
            Rsd.apply(this.local,local);
        }
        if(Rsd.isString(local))
        {
            this.local.url = local;
        }

    };

    this.defineProperty(type,"local", _localGetter, _localSetter,true);

    var _serverGetter = function () {

        if (this.__server == undefined) {
            this.__server = { timeout:10000,method:'get',url:''};
        }
        return this.__server;
    };

    var _serverSetter = function (server) {
        if(Rsd.isObject(server))
        {
            Rsd.apply(this.server,server);
        }
        if(Rsd.isString(server))
        {
            this.server.url = server;
        }

    };

    this.defineProperty(type,"server", _serverGetter, _serverSetter,true);
});