javascript - 如何全局定义套接字变量
问题描述
我的文件中有这段代码,在socketio
这里我可以socket
简单地使用。
import _ from 'lodash'
import mongoose from 'mongoose'
exports.register = (server, options, next) => {
var io = require('socket.io')(server.listener)
io.on('connection', async(socket) => {
// here I can use socket.emit() and all
})
next()
}
exports.register.attributes = {
name: 'socket'
}
现在,我需要使用io
套接字来处理emit
来自各种文件的事件,并且不想io.on('connection', async(socket) => {})
每次都连接它。
我怎样才能做到这一点?
谢谢!!!
解决方案
next
回调在这里没有很好的用途,因为它是同步的。由于 socket.ioconnection
事件可以多次触发,因此无法将其转换为更容易链接的 Promise,因此最好保持基于回调的方式。
有可能:
var socketIo = require('socket.io')
exports.register = (server, options) => {
var io = socketIo(server.listener);
return onConnect => {
io.on('connection', onConnect);
};
}
所以连接函数被创建一次:
const myConnection = register(myServer);
并通过应用程序使用:
myConnection(client => {
...
});
这种情况也可以从 observables 中受益,例如 RxJS。
如果套接字不支持重新连接,这可以简化为:
exports.register = (server, options) => {
var io = socketIo(server.listener);
return new Promise(resolve => {
io.once('connection', resolve);
});
}
连接承诺创建一次:
所以连接函数被创建一次:
const myConnection = register(myServer);
并通过应用程序使用:
const client = await myConnection;
...
推荐阅读
- javascript - 将 promise 函数推送到数组。使用 Promise.all。承诺尽早解决
- laravel - 如何在路由中运行带有参数的工匠命令?
- java - 带有 Powermock 的 Java 11 - 它们兼容吗?
- r - 从R中的字符串中提取捕获模式
- math - 按词汇顺序查找总和为给定数字的数千组
- typo3 - TYPO3 后端在访问互联网受限的服务器上渲染时间很长
- excel - TextBox 对象自定义 - 编译错误:无效或不合格的引用
- websocket - GKE 入口超时值
- c# - 终结器如何增加 C# 中对象的寿命?
- amp-html - 如何从 amp gmail 游乐场发送带有后备纯文本电子邮件的 amp-HTML 电子邮件?