这是我的服务器代码
const http = require('http');
const express = require('express');
const socketIO = require('socket.io');
var cors = require('cors');
var app = express();
var server = http.createServer(app);
var io = socketIO(server);
app.use(cors());
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'DELETE, PUT');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With,
Content-Type, Accept,x-auth');
next();
});
app.get('/', (req, res) => res.send('Hello World!'))
io.on('connection', (socket) => {
console.log('New User is connected...');
var sock = function() {
var callback = function(data) {
console.log('checkin data sending');
socket.emit('checkInDetected', data);
console.log(data);
}
socket.on("checkInDetected", callback);
return function() {
socket.removeListener("checkInDetected", callback);
};
}();
var sock1 = function() {
var callback2 = function(data) {
console.log('seding checkout data');
socket.emit('checkOutDetected',data);
console.log(data);
}
socket.on("checkOutDetected",callback2);
return function() {
socket.removeListener("checkOutDetected", callback2);
}
}();
socket.on('disconnect', function(){
console.log('disconnected');
//sock();
});
socket.on('disconnected', function(){
socket.disconnect();
});
});
server.listen(3000, () => {
console.log('Server Started on Port 3000');
});
客户端代码
export default class ScreenTwo extends Component {
constructor(props) {
name: this.props.navigation.state.params.name,
}
componentDidMount() {
axios({
method: 'post',
url: 'url',
data: {
'name': this.state.name
}
}).then((response) => {
console.log(response);
this.setState({
userid: response.data.userid
});
console.log(this.state.userid);
});
this.socket = SocketIOClient('http://13.126.210.35:3000');
DeviceEventEmitter.addListener('regionDidEnter', (data) => {
this.socket.emit('checkInDetected',
{
'userid': this.state.userid,
'name': this.state.name,
'location': 'Bandra'
}
);
}
DeviceEventEmitter.addListener('regionDidExit', () => {
this.socket.emit('checkOutDetected',
{
'name': this.state.name,
'userid': this.state.userid
}
);
goBack() {
delete this.state.name;
delete this.state.userid;
delete this.props.navigation.state.params.name;
console.log(this.props.navigation.state.params.name);
this.socket.emit('disconnected',
{
}
);
this.props.navigation.dispatch(resetAction);
this.props.navigation.goBack();
}
render() {
const { state } = this.props.navigation;
if (this.state.RegionExit === false) {
return (
<View style={styles.container}>
<View style={styles.backbutton}>
<TouchableOpacity
onPress={() => this.goBack()}
hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}
>
<Image
source={BackArrow}
style={{ width: 20 }}
/>
</TouchableOpacity>
</View>
<View sytle={styles.Title}>
<View style={styles.TitleAndBar}>
<View
style={[styles.TitleBarRed, this.state.RegionEntry && styles.TitleBarGreen]}
/>
<View>
<Text style={styles.titleText}>Rapid</Text>
<Text style={styles.titleText}>Out</Text>
</View>
</View>
<View style={styles.statusView}>
<Text style={styles.StatusText}>Status:</Text>
<Text style={[styles.StatusOut, this.state.RegionEntry && styles.StatusIn]}>
{this.state.status}
</Text>
</View>
<View style={styles.Location}>
<Text style={styles.LocationText}>You are at:</Text>
</View>
<View style={styles.LocationNameTitle}>
<Text
style={[styles.LocationName, this.state.RegionEntry && styles.LocationNameGreen]}
>{this.state.station}
</Text>
</View>
</View>
</View>
);
}
我有一个本机应用程序发送名称和用户ID,它包含两个屏幕,我使用反应导航从第一个屏幕的textinput输入发送名称到第二个屏幕。然后setState在componentDidMount期间更改第二个屏幕中的名称字符串。 然后在socket上发出它时会发出旧名称和新名称,即使它没有存储它的本地存储。然而它会散发出所有新旧名称。
问题是为什么我在socket中获取旧数据和新数据?