define(function () {
    var dataObj = new SQ.ServerData(237);//初始化时要把game_id作为参数传进去
    var s_type = 19;

//设置需要隐藏的服类型---可不设置
//     dataObj.hideTypes = [14];//此处设置隐藏掉服类型id为14的服类型
//设置服类型在客户端的显示名。如：服类型id为1的服类型在后台实际名称为正式服，在这里把它配置显示为”双线服“。
    dataObj.clientTypeNames = {};

//在实例化后一定要先调用这个方法获取游戏配置信息，在这个方法的回调或事件中，才可以调用下边的其他方法
//因为这个加载是要发送ajax请求的，所以需要做异步处理，异步处理这里提供了两种方法，至于选择哪一种，看你喜欢吧
//调用方法一，使用jQuery.deffrered对象解决异步问题
    var defer = $.Deferred();
    var servers_loaded_defer =$.Deferred();
    var loadServers = function (item,flag) {
        var defer = $.Deferred();
        dataObj.loadServers(s_type, item.s_name_id, 1).done(function (servers){
            item.servers = servers;
            defer.resolve();
            if(flag){
                servers_loaded_defer.resolve();
            }
        });
        return defer;
    };

    dataObj.loadConfig().done(function () {
        var types = dataObj.getNames(s_type);
        var prevPromise = $.Deferred().resolve();//初始化一个总能被解析的Promise
        $.each(types,function(key,item){
            prevPromise = prevPromise.then(function(){//每次迭代时prevPromise发生改变
                return loadServers(item,((key+1) === types.length));//返回一个新的Promise
            });
            servers_loaded_defer.then(function(){
                for (var i = 0; i < types.length; i++) {
                    if (types[i].servers.length === 0) {
                        types[i].removeFlag = true;
                    } else {
                        var count = 0;
                        var servers =types[i].servers;
                        for(var j=0;j<servers.length;j++ ){
                            if(servers[j].state === 2){
                                count++;
                            }
                        }
                        if(count === 0){
                            types[i].removeFlag = true;
                        }
                    }
                }
                var newTypes =[];
                for(var i=0;i<types.length;i++){
                    if(!types[i].removeFlag){
                        newTypes.push(types[i])
                    }
                }
                defer.resolve(newTypes);
            }).fail(function(error){

            });
        });
    }).fail(function () {
        defer.reject()
    });

//调用方法二，使用事件解决异步问题
    /*
     dataObj.bind("cfgloaded",function(){
     //配置加载成功的处理
     SQ.log('服数据加载成功');
     });
     dataObj.bind('cfgloaderr',function(){
     //加载失败的处理
     SQ.log('服数据加载失败');
     });
     dataObj.loadConfig();
     */

    return {defer:defer,dataObj:dataObj};
});