CNode

请教深入浅出书里的一个例子

Aanklos发布于12 年前最后回复12 年前10 回复5191 浏览0 收藏

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

W
wehtta#1·12 年前

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

C
coolicer#2·12 年前

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

A
alsotang#3·12 年前

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

A
anklos#4·12 年前

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

D
dlutwuwei#5·12 年前

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

R
ravenwang#6·12 年前

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

module.exports.select = select;

然后在使用时,比如:

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

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

A
anklos#8·12 年前
引用 ravenwang这里应该是一个module的部分代码片段,select是导出的一个方法: 然后在使用时,比如: 第一种写法,除了第一次请求,后续请求都会超时 第二种写法,所有请求都会获得结果

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

参与回复
登录后即可参与回复。登录