Avatar billede cronck Nybegynder
04. september 2012 - 15:05 Der er 7 kommentarer og
1 løsning

Nodejs - Inheritance

Hej,

Jeg har bokset en del med nedestående i dag.
Mit problem er at når socket.on('disconnect') kaldes, kender den ikke this.ssh .

Kan ikke helt gennemskue hvordan jeg får den til at referere til variablen/funktionen i dens parent.
Håber der er nogen som kan hjælpe med dette. :)

var child_process = require('child_process');

function Client(socket) {
    this.ssh = new SSH(socket);
   
    socket.on('disconnect', function(){
      this.ssh.kill();
    });
}

function SSH(socket){
  var queue = [],
      process = null,
      connected = false,
      busy = false,
      buffer = '';
 
  this.kill = function(){
    if (process !== null){
      console.log('Killing process '+ process.pid);
      process.kill(process.pid, 'SIGINT');
      process = null;
      connected = false;
    }
  };
};

var io = require('socket.io').listen(8080);

io.sockets.on('connection', function (socket) {
  var client = new Client(socket);
});
Avatar billede olebole Juniormester
04. september 2012 - 16:32 #1
<ole>

Der er tale om to forskellige funktioner, hvor this er scoped forskelligt. Løsningen er at oprette en variabel med en reference til instansen


function Client(socket) {
    var me = this;
    this.ssh = new SSH(socket);
   
    socket.on('disconnect', function(){
      me.ssh.kill();
    });
}

- men det er ikke altid en heldig løsning, da det kan medføre en cirkulær reference, som vanskeligt opløses ved garbage collection. Om det er tilfældet i dette tilfælde, kan jeg dog ikke vide noget om  =)

/mvh
</bole>
Avatar billede arne_v Ekspert
04. september 2012 - 16:41 #2
node.js bruger V8 engine som bruger mark and sweep GC ikke ref count GC, saa circular references er ikke et problem for GC
Avatar billede olebole Juniormester
04. september 2012 - 16:53 #3
Tak Arne - og således belært skulle der ikke være noget i vejen med den konstruktion.

I browsermiljøer - og ikke mindst IE - kan det somme tider være problematisk (selvom IE har fået mange af de værste ting rettet over de senere versioner). Men hvis node.js køre i et miljø, hvor der bliver støvsuget med mark and sweep, burde der ikke være problemer  =)
Avatar billede cronck Nybegynder
14. september 2012 - 11:15 #4
Hej Ole,

Beklager jeg har glemt at skrive, før nu.
Det virker. Jeg havde vidst ikke helt tænkt mig om. Tak for hjælpen. :)

Sender du et svar?
Avatar billede olebole Juniormester
14. september 2012 - 13:30 #5
Ellers tak, jeg samler ikke point. Arne bidrog med en meget vigtig information, så du kan prøve at spørge ham  =)
Avatar billede arne_v Ekspert
15. september 2012 - 17:14 #6
Hvis Mozilla er en trovaerdig kilde skulle browser JavaScript engines ogsaa bruge mark and sweep idag.

https://developer.mozilla.org/en-US/docs/JavaScript/Memory_Management

"Internet Explorer 6, 7 are known to have a reference-counting garbage collector for DOM objects."

"As of 2012, all modern browsers ship a mark-and-sweep garbage-collector."
Avatar billede cronck Nybegynder
26. september 2012 - 13:41 #7
Ok, interessant.
Denne del af koden var dog udelukkende på server-siden. :)

Arne hvis du vil have point, så læg gerne et svar.
Avatar billede arne_v Ekspert
26. september 2012 - 14:38 #8
ok

selvom jeg jo kun har bidraget med baggrunds information ikke med en loesning
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester