请教深入浅出书里的一个例子
发布于 10 年前 作者 anklos 4484 次浏览 最后一次编辑是 8 年前

例子是这样的,第一段代码里如果连续调用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 回复

第二段代码和第一段代码一样的效果啊。作者只是想引入Eventproxy

如果是单层的callback我还挺喜欢的。如果多了就要用链式的

单层的嵌套还体现不出 eventproxy 的威力

书上明明是说因为段1的残次品,所以引入段2代码啊。我表示十分不解。 2楼,3楼又是几个意思。。

第一段代码是错误的,因为if (status === "ready"){不能阻止多个进程读db,status重新复制是有时差的。 第二段代码的意思是即使发生这种极限情况,回调也只执行一次。 还有evnetproxy并没有真的注册事件,看看源码就知道了,只是保存了回调函数和计数器,其实就是个双重保险, 可是话又说回来,极限情况下,proxy.emit又怎么能保证只执行一次回调呢。。呵呵

这里应该是一个module的部分代码片段,select是导出的一个方法:

module.exports.select = select;

然后在使用时,比如:

var db = require('./db')
function(req, res) {
  db.select(function(results)) {
    res.send(results);
  }
}

第一种写法,除了第一次请求,后续请求都会超时 第二种写法,所有请求都会获得结果

两段代码都是正确的,只是第二种更好一些

第二种写法,所有请求还是会运行到if(status == 'ready')这里。如果status不是ready,就不会触发任何事件。为什么所有请求会获得结果呢?

@anklos 所有请求都在同一个proxy上注册了selected事件,proxy.emit时都会触发的

@ravenwang 谢谢,我理解了。这里select是做同一个查询,我原先错误想是用来select不同的SQL。

回到顶部