2017-04-26 39 views
0

IM构建一个简单的聊天应用程序与插座IO角2(打字稿)和的NodeJS作为后端服务器 我有这样的功能,完美的作品,当我点击连接按钮无法读取属性“发出”未定义的打字稿的

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 
 
    }) 
 

 
    }

但是我尝试使用bootbox.prompt每当用户试图连接,所以我换这个简单的函数内的所有代码

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

 
    \t }); 
 
    }

我得到这个奇怪的错误无法读取属性“发射”的未定义 我怎样才能解决这个问题,什么问题在这里?

回答

3

当你从addUser调用connectUser时,你正在从另一个函数(显然是回调函数)执行它。

的Javascript结合“”你正在使用的包装功能,并且该功能不具有“插座”成员。

当你调用该函数connectUser直接连接按钮,你可能称之为内嵌从对象,因而,“”绑定到不包含“插座”成员对象。

审查下面的代码片段,以对如何在“功能(){}”包装是影响你一看:

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(); 

基本上,你可能只需要改变这样的:

function(name) { connectUser(name); } 

对于这

(name) => connectUser(name) 

它应该工作。

相关问题