// 订阅
emitter.on("event1", function (message) {
console.log(message);
});
// 触发
emitter.emit('event1', "I am message!");
// 打印 I am message!
其中emitter.on方法中第一个参数是订阅的事件名称,第二个参数是事件发生时的处理函数,也就是观察者。而emitter.emit则是用来触发event1这个事件,"I am message!" 是传递的参数,这个参数会传递给观察者。
var select = function (callback) {
db.select("SQL", function (results) {
callback(results);
});
};
如果这时候,站点刚好启动,那么缓存不存在,那么同一条sql会被反复在数据库中查询,影响服务的整体性能(这里查询出来的数据设定为都是相同的结果)。
var event= new events;
var status = "ready"; //状态锁 ready为准备中 pending为执行中
var select = function (callback) {
event.once("selected", callback);
if (status === "ready") {
status = "pending";
db.select("SQL", function (results) {
event.emit("selected", results);
status = "ready";
});
}
};
上述代码中,使用status来标识,判断是否有请求去访问数据库了,并且把所有请求的回调都作为观察者,观察selected事件的发生。当第一条请求A进入时,执行select方法,把回调添加至观察者,然后发现status为ready,也就是没有请求在查询数据库,那么就会去查询数据库,并把状态设置为正在请求“pending”。然后立马第二条请求进来,发现已经在查询数据库了,那么就不再查询,只是添加回调在观察者队列中。然后等待数据库查询出结果后,会触发selected事件,把查询出的结果传递给所有请求的回调函数,并执行回调,并更改status的状态。