bnorth 的运行以事件方式驱动,各个模块松散耦合。使流程开发更为灵活,性能更为优化,事件管理更加统一,功能可深度定制,也为插件机制的实现提供了必要的支持。bnorth 的事件采用 es7 async 异步方案。
bnorth 下的概念 app,模块,插件,页面,弹出层,数据单元都是有 id 的,并且 id 生成规则不同,因此保证了 id 的唯一性。事件实际是以 id 为目标,触发也是对指定 id 的目标进行触发。所以任何有唯一 id 的概念都可以作为事件的目标。
任何代码可以通过事件管理模块,发出指定目标和指定事件名称的事件,并可以携带可变参数。
import App from '@bnorth/core/';
let app = new App();
app.event.emit(app._id, 'onUserMsg1', 'p1', 'p2'); // 向 app 目标发送名称为 onUserMsg1,参数为 p1, p2 的事件
任何模块可以向事件管理模块,注册事件处理函数,并指明目标和事件名称。当事件被触发时,事件处理函数将被调用执行。
import App from '@bnorth/core/';
let app = new App();
app.event.on(app._id, 'onUserMsg1', (...args)=>{...}); // 注册对应 app 目标的事件名为 onUserMsg1 的事件处理函数
注册后的事件处理函数,需要注销,否则可能造成内存泄露。可以通过事件处理函数注销,也可以通过注册时传递的标签批量注销,还可以通过制定目标和事件名的方法,注销一个类型的所有事件处理函数。
bnorth 事件采用异步管理方式,事件处理函数可以通过返回 promise 对象阻塞事件向下传递,进行异步处理。在异步操作完成时,再 resolve 或者 reject,释放事件阻塞。比如在 app 启动阶段需要异步从服务器获取配置信息,获取到配置后再继续 app 其他启动步骤。参见如下代码:
import App from '@bnorth/core/';
let app = new App();
app.event.on(app._id, 'onAppStarting', (...args)=>{
return fetch('http://url/api/concig').then(result=>app.config=result);
});
正常情况下,会按照注册到制定目标和事件名的处理函数的顺序依次处理,如果其中某个处理函数返回了非假的数据,将阻止后面事件处理函数的执行,并返回该数据。
注: