无法理解nodejs代码

时间:2014-08-28 03:43:09

标签: javascript node.js

我知道由于事件循环,Nodejs应该与其他laguages不同,这使得一开始很难理解。但是,我无法理解以下代码(我设法让它工作,但没有逻辑解释)。

每次收到特殊请求时,我都会创建SSH连接的新实例,让我们说:

sshCons = {};

sshObjt = new Connection();
sshCons[request_id] = sshObjt;
sshObjt.connect(); //and son on...

所以我创建了一个新的Connection和" store"即使我认为它只是一个携带属性及其值的对象,我们可以将它理解为一个"关联数组" 问题是,如果我将此代码放在上面写的行之后:

sshObjt.on('data', function() {
    // CODE
});

如果我创建多个sshObjt和"存储"节点如何知道哪个sshObjt是发出事件的那个sshCons他们?我之前试图遍历sshCons对象,但这不应该是处理这个问题的合适方法。如果我错了,这应该是处理多个对象事件的正确方法"存储"在{{1}}对象?

1 个答案:

答案 0 :(得分:5)

正如凯所说,this有很好的机会成为触发事件的对象;但这取决于谁为Connection编写代码。如果没有,它可能会给处理程序一个具有接收器的参数。 (你没有提供Connection来自哪里的任何细节,所以我们无法检查你究竟做了什么和不提供什么。)如果一切都失败了,那么图书馆设计师就无法提供在任何地方接收对象,你可以创建一个闭包:

sshObjt.on('data',
  (function(receiver) {
    return function() {
      // CODE where `receiver` is correct
    };
  })(sshObjt)
);

至于您对Kay的评论的担忧,这是没有根据的。将处理程序附加到对象时,将处理程序附加到对象 - 而不是附加到包含它的变量。就像这样:

var annas_husband = { name: "Tim", occupation: "mechanic" }
var joeys_dad = annas_husband;
joeys_dad.occupation = "supervisor";
annas_husband // => { name: "Tim", occupation: "supervisor" }

你没有改变joeys_dad的职业。你改变了蒂姆的。由于annas_husbandjoeys_dad都是蒂姆,因此两者都有。相反,这与你的案件有关:

var guy;
var guys = [];

guy = { name: "Jake", occupation: "mechanic" }
guys.push(guy);

guy = { name: "Tim", occupation: "mechanic" }
guys.push(guy);
guy.occupation = "supervisor"

guy = { name: "Jeff", occupation: "mechanic" }
guys.push(guy);

guys
// => [
//      { name: "Jake", occupation: "mechanic" },
//      { name: "Tim", occupation: "supervisor" }
//      { name: "Jeff", occupation: "mechanic" },
//    ]

在这里,你再次没有改变guy的职业,你改变了蒂姆的职业。杰克和杰夫当时不是guy,所以他们没有得到晋升。 on的工作方式完全相同 - 它将事件附加到对象,无论对象当前或将来驻留在哪个变量中。