io.socket.on()
使用指定的 eventName
开始监听来自 Sails 的套接字事件。当接收到匹配的事件时,触发提供的回调函数。
io.socket.on(eventName, function (msg) {
// ...
});
参数 | 类型 | 详情 | |
---|---|---|---|
1 | eventName | 套接字事件的名称,例如 'recipe' 或 'welcome' 。 |
|
2 | handlerFn | 当服务器向此套接字广播通知时,将调用的事件处理程序。仅当传入的套接字通知与 eventName 匹配时才会调用。 |
参数 | 类型 | 详情 | |
---|---|---|---|
1 | msg | 来自套接字通知的数据。 |
当客户端接收到与指定事件名称(例如 'welcome'
)匹配的传入套接字通知时,将调用此事件处理程序。当服务器直接向此套接字广播消息或向其所属的房间广播消息时,就会发生这种情况。要广播套接字通知,您需要使用 蓝图 API 或编写一些服务器端代码(例如,在操作、助手或甚至命令行脚本中)。这通常通过以下几种方式之一实现
sails.sockets
)监听“order”事件
io.socket.on('order', function onServerSentEvent (msg) {
// msg => {...whatever the server broadcasted...}
});
假设您正在为连锁餐厅构建一个订餐系统
// In your frontend code...
// (This example uses jQuery and Lodash for simplicity. But you can use any library or framework you like.)
var ORDER_IN_LIST = _.template('<li data-id="<%- order.id %>"><p><%- order.summary %></p></li>');
$(function whenDomIsReady(){
// Every time we receive a relevant socket event...
io.socket.on('order', function (msg) {
// Let's see what the server has to say...
switch(msg.verb) {
case 'created': (function(){
// Render the new order in the DOM.
var newOrderHtml = ORDER_IN_LIST(msg.data);
$('#orders').append(newOrderHtml);
})(); return;
case 'destroyed': (function(){
// Find any existing orders w/ this id in the DOM.
//
// > Remember: To prevent XSS attacks and bugs, never build DOM selectors
// > using untrusted provided by users. (In this case, we know that "id"
// > did not come from a user, so we can trust it.)
var $deletedOrders = $('#orders').find('[data-id="'+msg.id+'"]');
// Then, if there are any, remove them from the DOM.
$deletedOrders.remove();
})(); return;
// Ignore any unrecognized messages
default: return;
}//< / switch >
});//< / io.socket.on() >
});//< / when DOM is ready >
请注意,此示例假设后端在某个时候调用
.publish()
或.broadcast()
。这可能是通过自定义代码或通过 蓝图 API 完成的。
'connect'
事件默认情况下,当在页面上加载 Sails 套接字客户端时,它会自动开始为您连接套接字。当使用默认的自动连接套接字(io.socket
)时,您无需等待套接字连接即可使用它。换句话说,您可以在监听其他套接字事件或调用诸如 io.socket.get()
之类的方法之前立即使用它。Sails 套接字客户端将排队您在此期间执行的操作,并在连接生效后自动重播。
因此,对于大多数应用程序而言,直接使用 'connect'
事件是不必要的。但为了完整起见,值得一提的是,您也可以绑定自己的 'connect'
处理程序
io.socket.on('connect', function onConnect(){
console.log('This socket is now connected to the Sails server.');
});
'disconnect'
事件如果套接字与服务器的连接中断(可能是因为服务器重新启动或客户端遇到某种网络问题),则可以处理 disconnect
事件,以显示错误消息甚至手动重新连接套接字。
io.socket.on('disconnect', function onDisconnect(){
console.log('This socket lost connection to the Sails server');
});
套接字可以配置为自动重新连接。但是,截至 Sails v1,Sails 套接字客户端默认情况下禁用此行为。实际上,由于您的用户界面可能在断开连接期间错过了套接字通知,因此您几乎始终希望手动处理任何相关的自定义逻辑。(例如,一个“检查您的互联网连接”错误消息)。
- 请记住,套接字仅在连接时(例如,浏览器选项卡处于打开状态)或直到使用
.unsubscribe()
或.leave()
在服务器上手动取消订阅为止,才一直订阅某个房间。- 在监听来自资源型发布/订阅调用和蓝图的套接字消息时,事件名称始终与调用模型的标识相同。例如,如果您有一个名为“UserComment”的模型,则该模型的标识(以及
UserComment.publish()
使用的套接字事件名称)是“usercomment”。- 为了上下文,套接字通知有时也称为“服务器发送事件”或 "彗星) 消息”。
req
)