2017-04-26 5 views
0

im einen einfachen Chat-Anwendung mit Sockel io Winkel 2 (Typoskript) und NodeJS als Backend-Server Aufbau habe ich diese Funktion, die perfekt funktioniert, wenn ich die Verbindungstaste klickenkann nicht lesen Eigenschaft ‚emittieren‘ undefinierter Typoskript

connectUser(name){ 
 
    
 
    \t 
 
    \t if (name == null || name == ""){ 
 
    \t return \t console.log('you must enter a valid username'); 
 
    \t 
 
    \t } 
 
    \t this.username = name; 
 

 
    \t this.socket.emit('add-user',name); 
 
    \t //load connected users in the user-window section 
 
    \t this.socket.emit('request-users',{data:'request users success'}); 
 
    \t var connecctedUsersListener$ = Observable.fromEvent(this.socket,'users'); 
 
    \t connecctedUsersListener$.subscribe((observer:any)=>{ 
 
    \t \t this.users = observer; 
 
    \t },(err)=>{ 
 
    \t \t if(err) throw err; 
 
    \t },()=>{ 
 
    \t \t console.log('complet'); 
 
    \t }); 
 
    
 
    //load messages and keep track of Them 
 
    this.socket.emit('request-messages',{data:'request Messages success'}); 
 
    var messageListener$ = Observable.fromEvent(this.socket,'message'); 
 
    messageListener$.subscribe((observer:any) =>{ 
 
    \t this.messages = observer; 
 
    \t 
 
    }) 
 

 
    }

aber ich versuche bootbox.prompt zu verwenden, wenn der Benutzer so zu verbinden versucht i innerhalb dieser einfachen Funktion den gesamten Code wickeln

addUser(){ 
 
    bootbox.prompt('what is your name ',function(name){ 
 
    connectUser(name); // this is the function in the first code snippet \t 
 

 
    \t }); 
 
    }

ich diesen seltsamen Fehler Kann nicht Eigentum lesen ‚emit‘ undefinierter , wie ich das beheben kann und was ist das Problem hier?

Antwort

3

Wenn Sie connectUser von addUser aufrufen, tun Sie es von einer anderen Funktion (anscheinend ein Rückruf).

Javascript bindet ‚diese‘ zu dieser Wrapper-Funktion Sie verwenden, und diese Funktion nicht über ein ‚Buchse‘ Mitglied.

Wenn Sie die Funktion connectUser von der Verbindungstaste direkt anrufen, rufen Sie es wahrscheinlich inline aus dem Objekt, also ‚diese‘ wird an das Objekt gebunden, die das ‚Buchse‘ Mitglied enthält .

Überprüfen Sie den folgenden Ausschnitt einen Blick auf haben, wie die "function() {}" Wrapper Sie wirkt:

function(name) { connectUser(name); } 

Für:

class Whatever { 
    socket: { emit: string } 

    constructor() 
    { 
     this.socket = { emit: 'works' }; 
    } 

    doSomething() 
    { 
     console.warn(this.socket.emit); 
    } 

    works() 
    { 
     this.doSomething(); 
     (() => this.doSomething())(); 
    } 

    doesntWork() 
    { 
     (function() { this.doSomething() })(); 
    } 
} 

let obj = new Whatever(); 
obj.works(); 
obj.doesntWork(); 

Grundsätzlich kann man das wahrscheinlich nur ändern dies

(name) => connectUser(name) 

und es sollte funktionieren.

Verwandte Themen