Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

278
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!