本地绑定这个未定义的函数

时间:2017-06-05 17:22:47

标签: javascript react-native socket.io

我试图在socket上设置状态但是

componentWillMount() {
socket.on('foo', function(msg){
//alert(JSON.stringify(msg));
//this.setState({user:msg});
this.setState({veri:msg});
this.setState({initial:msg});

});
  

undefined不是一个函数(评估' this.setState({veri:msg   })')       index.android.js:95:14发出       index.js:133:25 onevent       socket.js:270:15 onpacket       socket.js:228:19       index.js:21:20发出       index.js:133:25 ondecoded       manager.js:345:12       index.js:21:20发出       index.js:133:25添加       index.js:241:16 ondata       manager.js:335:19       index.js:21:20发出       index.js:133:25 onPacket       socket.js:457:18       socket.js:274:18发出       index.js:133:25 onPacket       transport.js:145:12 onData       transport.js:137:16 onmessage       websocket.js:147:16 dispatchEvent       事件target.js:172:43       WebSocket.js:148:27发出       EventEmitter.js:182:12   __callFunction       MessageQueue.js:250:47       MessageQueue.js:101:26   __守护       MessageQueue.js:218:6 callFunctionReturnFlushedQueue       MessageQueue.js:100:17

1 个答案:

答案 0 :(得分:2)

虽然不可能从你提供的一小部分代码中确切地说出来,但this内的socket.on可能是指套接字,而不是React。

您可以尝试使用箭头功能:

socket.on('foo', msg => {
    this.setState({veri:msg});
    this.setState({initial:msg});
});

您还可以在调用this之前将self设置为某些内容(例如socket),然后在内部使用self代替this

const self = this;
socket.on('foo', function(msg){
    this.setState({veri:msg});
    this.setState({initial:msg});
});

您还可以在处理程序外定义函数,并将其绑定到this

const handleFoo = (function(msg){
    this.setState({veri:msg});
    this.setState({initial:msg});
}).bind(this);

socket.on('foo', handleFoo);

所有这三种方法都是保持this期望的方式,而不是让它在另一种背景下改变。