我的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) => {})
。
我该怎么做呢?
谢谢!
发布于 2019-04-05 07:31:46
next
回调在这里没有很好的用途,因为它是同步的。由于socket.io connection
事件可以被多次触发,因此不能将其转换为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 => {
...
});
这种情况也可以从可观测数据中受益,例如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;
...
发布于 2019-04-12 13:47:46
您可以使用Server methods在服务器实例之间共享功能
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
})
// here use server methods
server.decorate('server', 'io', io);
next()
}
exports.register.attributes = {
name: 'socket'
}
然后在你的控制器中
handler: function (request, reply) {
const io = request.server.io;
}
https://stackoverflow.com/questions/55509973
复制相似问题