2014-08-28 5 views
0

Я знаю, что Nodejs должен отличаться от других языков, связанных с циклом событий , что затрудняет понимание вначале. Однако я не могу понять следующий код (мне удалось заставить его работать, но не логическое объяснение).Не могу понять код nodejs

создать новые экземпляры соединения SSH каждый раз, когда я получаю специальный запрос, скажем:

sshCons = {}; 

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

Так что создать новое подключение и «магазин» это в том, что мы можем понять, как «ассоциативно array ", даже если я думаю, что это просто объект, который несет свойства и их значения. Вопрос заключается в том, если поместить этот код после строки написано выше:

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

Как Node знать, какой sshObjt является тот, который излучает событие, если я создал несколько sshObjt с и «хранящийся» их? Я ранее пытался перебрать объект sshCons, но это не должно быть подходящим способом обработки этого. В случае, если я ошибаюсь, что должно быть правильным способом обработки событий нескольких объектов, «сохраненных» в объекте sshCons?

+0

Я не уверен на 100%, но есть вероятность, что в обратном вызове 'this' будет ссылаться на испускающий« sshObjt ». – kay

+0

Это имеет смысл. Но дело в том, что, поскольку я «постоянно делаю новый' sshObjt '' и поэтому «перезаписываю» последний созданный sshObjt, я думал, что Node будет присутствовать только на * data * событии последнего созданного 'sshObjt'. Надеюсь, я мог бы объяснить себя. – ederollora

+1

Вы перезаписываете переменную, вы не манипулируете самим объектом, который был там сохранен. –

ответ

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 «s. Ты изменил Тима. Поскольку оба 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 «s, вы изменили Тима. Джейк и Джефф не были в то время guy, поэтому они не получили поощрения. on работает точно так же - он привязывает событие к объекту, независимо от того, в какой переменной находится объект в настоящее время или в будущем.

+0

«Когда вы прикрепляете обработчик к объекту, вы привязываете обработчик к объекту, а не к переменной, которая его содержит». Это было почти предложение, которое я искал. Благодарю. Библиотека ssh2 из mscdex https://github.com/mscdex/ssh2 – ederollora

+0

Тогда я думаю, что в вашем коде логическая ошибка: 'Connection' не испускает' data', * потоки * вы получаете из 'Connection' делать. (Нечего делать с этим вопросом, просто подумал упомянуть об этом.) – Amadan

+0

Правильно, я не хотел усложнять вопрос, объясняющий 'stream' был объектом, который пришел из' sshObjt.shell() '... Я пробовал сделать его простым и применить к контексту события * data *. Во всяком случае, я мог бы привести пример с * подключенным * событием, которое действительно выбрано объектом (я думаю) – ederollora

Смежные вопросы