/****************************************************************** * * 桥接:控制器管理过渡 * ******************************************************************/ const MOD = require( "nx.mod" ); const BridgeMods = cc.Class( { extends: MOD, name: "BridgeMods", // 初始化 initialize: function( _args ) { // USPER this._super( _args ); // 单例列表 this.modules = []; // 访问接口(设置) nx.bridge.mods = this; return true; }, // 销毁 uninitialize: function() { // 访问接口(关闭) nx.bridge.mods = null; // USPER return this._super(); }, // 模块载入 install: function( _id, _key ) { // 重复载入 if( CC_DEBUG ) { if( nx.dt.arrMember( this.modules, null, ( m ) => { return m && m.__fkey == _key; } ) ) { nx.error( "$MODS:模块载入重复! ", _key ); return; } } // 载入 let ref = require( _key ); let mod = ref ? ref.getInstance( _id, _key, true ) : null; if( !mod ) { nx.error( "$MODS:模块载入失败! ", _key ); return; } // 初始化 mod.setFunctionID( _id, _key ); mod.setFunctionLock( true ); // 记录 this.modules.push( mod ); nx.debug( "$MODS:模块载入 ", _key ); }, // 模块卸载 uninstall: function( _key ) { nx.debug( "$MODS:模块卸载 ", _key ); nx.dt.arrDelete( this.modules, ( m ) => { return m && m.__fkey == _key; } ); }, // 模块清空 uninstallAll: function() { this.modules = []; if( this.modTicker ) { clearTimeout( this.modTicker ); this.modTicker = 0; } }, // 初始化所有模块 initModules: function( _cb ) { nx.debug( "$MODS:初始化所有模块..." ); // 全部锁定 this.modules.forEach( mod => { mod.setFunctionLock( true ); } ); // 重新解锁 this.checkUnLock( _cb ); }, // 首次解锁判定 checkUnLock: function( _cb ) { // 统计待更新模块 let mods = []; for( let i = 0; i < this.modules.length; ++i ) { // 无效/已经解锁/没有具体功能 let mod = this.modules[ i ]; if( !mod || !mod.__flock ) { continue; } // 未解锁 let ret = nx.bridge.jumper.checkSource( mod.__fid ); if( nx.dt.objNEmpty( ret ) ) { continue; } mod.setFunctionLock( false ); mods.push( mod ); } // 空 if( nx.dt.arrEmpty( mods ) ) { nx.dt.fnInvoke( _cb, true ); return; } nx.debug( "$MODS:功能模块更新...总共:%s 更新:%s", this.modules.length, mods.length ); // 超时处理 let self = this; let timout = function( _name, _open ) { if( self.modTicker ) { clearTimeout( self.modTicker ); self.modTicker = 0; } if( _open ) { self.modTicker = setTimeout( () => { nx.warn( nx.text.format( "ErrModTimeout", _name ) ); next(); }, 2000 ); } }; // 依次更新 let done = false; let next = function() { // 结束 if( mods.length == 0 ) { if( !done ) { nx.dt.fnInvoke( _cb, true ); done = true; } return; } let mod = mods.shift(); nx.debug( "$MODS:[%s]\t%s", mods.length, mod.__fkey ); timout( mod.__fkey, true ); mod.reqBaseFromServer( ( _ret, _data ) => { nx.debug( "$MODS: done.\t\t", mod.__fkey, _ret ); timout( mod.__fkey, false ); next(); } ); } next(); }, } ); module.exports = BridgeMods;