例子是这样的,第一段代码里如果连续调用select的话,只有第一次生效。
第二段代码可以把多次调用排在时间队列里。
我不懂的是第二段里,虽然是每次调用会增加一个事件监听,但是如果在查询状态是状态不是ready
,程序不会运行到proxy
触发selected
事件吧?如果没有触发,只是添加了事件监听有什么用呢?
我强烈觉得我哪里没理解正确,请指教。谢谢!
var status = "ready";
var select = function(callback) {
if (status === "ready"){
status = 'pending';
db.select("SQL", function (results){
callback(results);
status = "ready";
});
}
}
var proxy = new EventProxy();
var status = "ready";
var select = function(callback) {
proxy.once("selected", callback);
if (status === "ready"){
status = 'pending';
db.select("SQL", function (results){
proxy.emit("selected", results)
status = "ready";
});
}
}
10 回复
第一段代码是错误的,因为if (status === "ready"){
不能阻止多个进程读db,status重新复制是有时差的。
第二段代码的意思是即使发生这种极限情况,回调也只执行一次。
还有evnetproxy并没有真的注册事件,看看源码就知道了,只是保存了回调函数和计数器,其实就是个双重保险,
可是话又说回来,极限情况下,proxy.emit又怎么能保证只执行一次回调呢。。呵呵