185 lines
4.2 KiB
JavaScript
185 lines
4.2 KiB
JavaScript
/******************************************************************
|
|
*
|
|
* 桥接:控制器管理过渡
|
|
*
|
|
******************************************************************/
|
|
|
|
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; |