【问题标题】:Cannot read property 'emit' of undefined typescript无法读取未定义打字稿的属性“发射”
【发布时间】:2017-04-26 21:40:47
【问题描述】:

我正在构建一个简单的聊天应用程序,使用 socket io angular 2(typescript) 和 nodejs 作为后端服务器 我有这个功能,当我点击连接按钮时效果很好

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

  }

但是,每当用户尝试连接时,我都会尝试使用 bootbox.prompt,所以我将所有代码包装在这个简单的函数中

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

  	  });
  }

我收到这个奇怪的错误 无法读取未定义的属性“发射” 我该如何解决这个问题?这里有什么问题?

【问题讨论】:

    标签: angular typescript socket.io


    【解决方案1】:

    当您从 addUser 调用 connectUser 时,您是从另一个函数(显然是回调)进行的。

    Javascript 将“this”绑定到您正在使用的包装函数,而该函数没有“socket”成员。

    当您直接从连接按钮调用函数 connectUser 时,您可能是从对象内联调用它,因此,'this' 绑定到对象确实包含“socket”成员。

    查看以下 sn-p 以了解“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();
    

    基本上你可以改变这个:

    function(name) { connectUser(name); }
    

    为此

    (name) => connectUser(name) 
    

    它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多