Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

275
Vistas
No se puede leer la propiedad 'emitir' de mecanografiado indefinido

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í?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda