Pro*_*fer 7 javascript node.js socket.io hapijs
我的文件中有这段代码,在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'
}
Run Code Online (Sandbox Code Playgroud)
现在,我需要使用io
套接字处理emit
来自各种文件的事件,并且不想io.on('connection', async(socket) => {})
每次都连接它。
我怎样才能做到这一点?
谢谢!!!
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);
};
}
Run Code Online (Sandbox Code Playgroud)
因此,连接函数创建一次:
const myConnection = register(myServer);
Run Code Online (Sandbox Code Playgroud)
并通过应用程序使用:
myConnection(client => {
...
});
Run Code Online (Sandbox Code Playgroud)
这种情况也可以从可观察变量(例如RxJS)中受益。
如果套接字不支持重新连接,则可以简化为:
exports.register = (server, options) => {
var io = socketIo(server.listener);
return new Promise(resolve => {
io.once('connection', resolve);
});
}
Run Code Online (Sandbox Code Playgroud)
连接承诺创建一次:
因此,连接函数创建一次:
const myConnection = register(myServer);
Run Code Online (Sandbox Code Playgroud)
并通过应用程序使用:
const client = await myConnection;
...
Run Code Online (Sandbox Code Playgroud)