如何使用来自其他功能的套接字事件?
问题描述:
在socket.io我们创建一个实例,并使用插座这样如何使用来自其他功能的套接字事件?
var server = require('http').createServer();
var io = require('socket.io')(server);
io.on('connection', function(socket){
socket.on('event', function(data){});
socket.on('disconnect', function(){});
});
server.listen(3000);
我们怎样才能创造这样的其他功能的插座事件。有没有任何方法或技巧,以适当的。
var server = require('http').createServer();
var io = require('socket.io')(server);
io.on('connection', function(socket){
socket.on('event', function(data){});
socket.on('disconnect', function(){});
});
var f1 = function (socketID) {
if(socketID){
io.to(socketID).emit('event1', 'event1 data'); //working
socket.on('call2', function (data) { // not working
});
}
}
server.listen(3000);
答
当你发送请求,并试图等待这一请求特定的响应,它是有点棘手使用基于消息的协议,像socket.io对于这种情况。 HTTP完全为请求/响应而设计,因为单个连接仅用于该请求/响应,因此响应是属于您的请求的响应。
这对于socket.io不适用。这是一个基于消息的方案。当您发送消息并等待从另一端(在多用户环境中)返回消息时,您必须非常小心,以免发生以下情况:
- 安装太多事件侦听器并结束与重复。
- 您得到的回应是专门针对您的原始请求,而不是针对可能在类似时间范围内发生的其他请求。
解决此问题的一种方法是为所有请求/响应消息添加请求标识符。当你发送请求时,你添加一个唯一的请求ID。当返回响应时,它包含该请求ID,然后您的代码可以知道哪个响应属于哪个请求。
下面是如何实现的请求ID概念(这需要另一端的合作,并返回它发送相同的请求ID)的想法:
var idCntr = 0;
function f1(socketID) {
if(socketID){
var id = idCntr++;
io.to(socketID).emit('event1', {id: id, data: 'event data'});
function listener(data) {
// if this is our message
if (data.id === id) {
// once our response is received, remove event handler
socket.removeListener('responseToEvent1', listener);
// process response here
// code here...
}
}
// wait for our response
socket.on('responseToEvent1', listener);
}
}
或者,这里有一个更面向对象的方案这增加了Socket对象的方法称为.emitRequest()
:
var idCntr = 0;
socket.emitRequest = function(msg, data, responseMsg, responseFn) {
var id = idCntr++;
function listener(response) {
// if this is our message
if (response.id === id) {
// once our response is received, remove event handler
this.removeListener(responseMsg, listener);
// call response handler
responseFn(response.data);
}
}
this.emit(msg, {id: id, data: data});
this.on(responseMsg, listener);
}
注意:对于这两个代码段的,你连接的另一端需要进行合作,并返回原始请求S的id
财产o接收监听者可以知道哪个请求发出哪个响应。
@Rishi - 这是否回答了您的问题? – jfriend00