如何全局定义套接字变量 [英] How to define socket variable globally

查看:101
本文介绍了如何全局定义套接字变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 socketio 文件中有这段代码,在这里我可以简单地使用 socket

I have this piece of code in my socketio file and here I can use socket simply.

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 套接字发出来自各种文件的事件,不想连接这个 io.on('connection',async(socket)每次都=)>> {})

Now, I need to use theio socket to emit events from various files and don't want to connect this io.on('connection', async(socket) => {}) every time.

我该怎么做?

谢谢!!!

推荐答案

next 回调在这里没有用处,因为它是同步的。由于socket.io 连接事件可以多次触发,因此无法将其转换为更容易链接的承诺,因此最好保持基于回调的事件。

next callback doesn't serve a good purpose here because it's synchronous. Since socket.io connection event can be triggered multiple times, it cannot be converted to a promise for easier chaining, so it's better for it to stay callback-based.

它可以是:

var socketIo = require('socket.io')

exports.register = (server, options) => {
  var io = socketIo(server.listener);

  return onConnect => {
    io.on('connection', onConnect);
  };
}

因此创建连接函数一次:

So connection function is created once:

const myConnection = register(myServer);

并通过申请使用:

myConnection(client => {
  ...
});

这种情况也可以受益于可观察量,例如: RxJS。

This situation can also benefit from observables, e.g. RxJS.

如果套接字不支持重新连接,可以简化为:

In case the socket shouldn't support reconnections, this could be simplified to:

exports.register = (server, options) => {
  var io = socketIo(server.listener);

  return new Promise(resolve => {        
    io.once('connection', resolve);
  });
}

连接承诺创建一次:

所以连接函数创建一次:

So connection function is created once:

const myConnection = register(myServer);

并通过申请使用:

const client = await myConnection;
...

这篇关于如何全局定义套接字变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆