我知道由于事件循环,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}}对象?
答案 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_husband
和joeys_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
的工作方式完全相同 - 它将事件附加到对象,无论对象当前或将来驻留在哪个变量中。