estoy creando una aplicación de chat simple con socket io angular 2 (mecanografiado) y nodejs como servidor backend. Tengo esta función que funciona perfectamente cuando hago clic en el botón de conexión.
connectUser(name){ if (name == null || name == ""){ return console.log('you must enter a valid username'); } this.username = name; this.socket.emit('add-user',name); //load connected users in the user-window section this.socket.emit('request-users',{data:'request users success'}); var connecctedUsersListener$ = Observable.fromEvent(this.socket,'users'); connecctedUsersListener$.subscribe((observer:any)=>{ this.users = observer; },(err)=>{ if(err) throw err; },()=>{ console.log('complet'); }); //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) =>{ this.messages = observer; }) }sin embargo, trato de usar bootbox.prompt cada vez que el usuario intenta conectarse, así que envuelvo todo el código dentro de esta función simple
addUser(){ bootbox.prompt('what is your name ',function(name){ connectUser(name); // this is the function in the first code snippet }); }Recibo este error extraño No se puede leer la propiedad 'emitir' de undefined ¿Cómo puedo solucionarlo y cuál es el problema aquí?
Cuando está llamando a connectUser desde addUser, lo está haciendo desde otra función (aparentemente una devolución de llamada).
Javascript vincula ' esto ' a la función contenedora que está utilizando, y esa función no tiene un miembro ' socket '.
Cuando llama a la función connectUser directamente desde el botón de conexión, probablemente la esté llamando en línea desde el objeto, por lo tanto, ' this ' está vinculado al objeto que contiene el miembro ' socket '.
Revise el siguiente fragmento para ver cómo le afecta el envoltorio "function() { }":
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();Básicamente, probablemente puedas cambiar esto:
function(name) { connectUser(name); }Para esto
(name) => connectUser(name)y debería funcionar.