diff --git a/MessageCenter.js b/MessageCenter.js new file mode 100644 index 0000000..ccdce68 --- /dev/null +++ b/MessageCenter.js @@ -0,0 +1,110 @@ + +/************************************************************************ + * Copyright (c) 2017 App + * Author : liji.liu + * Mail : liuliji1184899343@163.com + * Date : 2017-11-04 + * Use : 消息中心 + ************************************************************************/ + +var bindFuncList = [];// 保存监听函数 +/** + * bindFuncList结构如下 + * [ + * 'event1':[func1,func2], + * 'event2',[func3,func4] + * ] + */ +/** + * 当暂时没有监听,或者场景没有初始化的时候,会将提前收到的消息和数据, + * 保存到emitList中,结构如下: + * [ + * 'event1':[args1,args2], + * 'event2':[args3,args4]; + * ] + */ +var emitList = []; +/** + * 设置监听 + * @param {监听的事件的名字} key + * @param {监听的回调方法} cbFunc + */ +// 设置事件监听 +function on(key,cbFunc){ + debugger; + if (bindFuncList[key]){ + bindFuncList[key].push(cbFunc); + }else { + var ary = new Array(); + ary.push(cbFunc); + bindFuncList[key] = ary; + } +} +/** + * 触发事件监听函数 + * @param {监听的事件的名字} key + * @param {调用时传的参数} args + */ +// emit事件,发送消息 +function emit(key,args){ + var ary = bindFuncList[key]; + if(ary){// 如果已经注册了事件,就直接发送消息 + for (var i in ary) { + if (ary.hasOwnProperty(i)) { + try { + ary[i].call(this,args); + } catch (error) { + debugger; + } + } + } + }else {// 没有注册,先将要发送的消息保存,然后等待事件注册后,再一起emit + if (emitList[key]){ + emitList[key].push(args); + }else { + var ary = new Array(); + ary.push(args); + emitList[key] = ary; + } + } +} +// emitAll,将所有消息都emit +function emitAll(){ + debugger; + for (var key in emitList) { + if (emitList.hasOwnProperty(key)) { + var emitAry = emitList[key]; + for (var j in emitAry) { + if (emitAry.hasOwnProperty(j)) { + var args = emitAry[j];// 去除参数 + var ary = bindFuncList[key];// 去除监听的方法 + // 开始执行事件 + for (var iterator in ary) { + if (ary.hasOwnProperty(iterator)) { + try { + ary[iterator].call(this,args); + } catch (error) { + debugger; + } + } + } + + } + } + } + } + emitList = []; +} + +// 清空全部的事件监听 +function popAll(){ + bindFuncList = []; +} + +module.exports = { + 'on': on,// 设置事件监听 + 'emit': emit,// emit事件,发送消息 + 'emitAll': emitAll,// emitAll,将所有消息都emit + 'popAll': popAll,// 清空全部的事件监听 +} + diff --git a/README.md b/README.md index 26585a2..437cdf2 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,8 @@ # MessageCenter js , cocos creator +该文件适合在js项目中使用,用于在多个脚本之间进行通讯并发送消息。博主是用cocos Creator进行游戏开发的,其他的并不是很了解,所以,如果使用者是cocos creator使用者,可以使用该文件进行消息发送。 +使用说明: +1. 在使用过程中,需要将该脚本引用到相应的js文件中去,然后,通过on方法来设置事件监听,通过emit来发送消息。popAll方法用来清空监听列表,emitAll用来派发之前没有发送出来的消息。 +2. 在项目的脚本或者组件初始化的过程中。先调用on方法,设置所有的事件监听。然后emitAll,保证在监听设置的过程中,收到的网络消息不被丢弃。在emitAll方法中,会对消息进行判断,如果当前事件监听列表中没有事件监听,就先将收到的消息保存,然后等初始化完成并设置好事件监听后,统一调用emitAll方法,将所有的消息一起发出来。保证不丢包。 +3. 在当前场景的根节点的destroy方法中,调用popAll方法,保证在当前场景销毁的时候,所有的监听被移除掉了。 +