socket.io,动态添加消息处理程序

2023-12-24

我很高兴编写了一个node.js 服务器,它使用socket.io 与客户端通信。 这一切都运作良好。 socket.on('connection'...) 处理程序有点大,这让我想到了另一种组织代码并将处理程序添加到生成器函数中的方法,如下所示:

sessionSockets.on('connection', function (err, socket, session) {
  control.generator.apply(socket, [session]);
}

生成器采用一个包含套接字事件及其各自处理函数的对象:

var config = {
  //handler for event 'a'
  a: function(data){
    console.log('a');
  },

  //handler for event 'b'
  b: function(data){
    console.log('b');
  }
};


function generator(session){

  //set up socket.io handlers as per config
  for(var method in config){
    console.log('CONTROL: adding handler for '+method);

    //'this' is the socket, generator is called in this way
    this.on(method, function(data){
      console.log('CONTROL: received '+method);
      config[method].apply(this, data);
    });
  }
};

我希望这会将套接字事件处理程序添加到套接字中,它确实做到了,但是当任何事件进入时,它总是调用最新添加的事件处理程序,在本例中始终是 b 函数。

有人知道我在这里做错了什么吗?


问题出现是因为到那时this.on回调触发(假设在绑定后几秒钟内),for循环结束并且method变量成为最后一个值。

要解决这个问题,你可以使用一些 JavaScript 魔法:

//set up socket.io handlers as per config
var socket = this;
for(var method in config){
  console.log('CONTROL: adding handler for '+method);

  (function(realMethod) {
    socket.on(realMethod, function(data){
      console.log('CONTROL: received '+realMethod);
      config[realMethod].apply(this, data);
    });
  })(method);  //declare function and call it immediately (passing the current method)
}

当你第一次看到它时,这种“魔法”很难理解,但是当你了解它时,事情就变得清晰了:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

socket.io,动态添加消息处理程序 的相关文章

  • Web 串行 API - 未捕获(承诺中)DOMException:无法打开串行端口/所需成员 baudRate 未定义

    下面的代码可以在我的 Xubuntu 机器上运行 但现在我在 Kubuntu 上 它不再工作了 它不会打开端口 Arduino IDE 工作正常 可以向开发板写入代码 并且我可以在 Chrome 中选择设备 Arduino Uno 但当我尝
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 使用 useReducers 调度函数发送多个操作?

    使用时是否可以通过调度函数发送多个动作useReducer挂钩反应 我尝试向它传递一组操作 但这会引发未处理的运行时异常 明确地说 通常会有一个初始状态对象和一个减速器 如下所示 const initialState message1 nu
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • Node.js:如何在检索数据(块)时关闭响应/请求

    我正在用 node js 构建一个应用程序 它加载多个页面并分析内容 因为 node js 发送块 所以我可以分析这些块 如果一个块包含例如索引 nofollow 我想关闭该连接并继续其余部分 var host example com to
  • 使用node.js安装xml2json时出错

    我尝试为 node js 安装 xml2json 包 但它给了我错误 Error are as below 我的系统配置如下 Node js 版本 v5 4 1 npm 版本 3 3 12 操作系统 Windows 10 64 位 pyth
  • 除了更改标题之外,如何在 Firefox 中强制另存为对话框?

    有没有办法在 ff 中强制打开 www example com example pdf 的另存为对话框 我无法更改标题 如果您可以将文件以 Base64 格式输出到客户端 则可以使用 data uri 进行下载 location href
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • 是否有“npmpublish-f”的解决方法

    现在npm publish f已弃用 是否有解决方法或软件包可以覆盖发布后的目标版本 我知道关于semver http semver org 我还想要npm publish f 您可以取消发布特定版本 然后重新发布它 npm unpubli
  • 通过 CDN 使用 Dojo 时如何加载自定义 AMD 模块?

    我正在使用 google 的 CDN 并尝试使用他们的加载程序加载我自己的 AMD 模块 我知道我做错了什么 但我被困住了 有任何想法吗
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • Grails 在 javascript 内的 GSP 站点中使用 grails var

    我有一个在 GSP 文件中的 javascript 代码中使用 grails 变量值的问题 例如 我有一个会话值session getAttribute selectedValue 我想在 javascript 代码部分使用这个值 我现在的
  • 如何在机器人框架中的两条消息之间设置延迟 - Node.js

    我正在开发一个机器人 它使用 botbuilder JS V4 使用 Direct Line 连接到我们的客户端应用程序 由于某些原因 消息以错误的顺序发送给机器人 例如 用户 你好 机器人 我能帮你什么忙吗 机器人 嗨 我是机器人 作为解
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 为 illustrator 导出脚本以保存为 web jpg

    任何人都可以帮我为 illustrator CC2017 编写一个脚本 将文件以 JPG 格式导出到网络 旧版 然后保存文件并关闭 我有 700 个文件 每个文件有 2 个画板 单击 文件 gt 导出 gt 另存为 Web 旧版 然后右键文
  • 使用 Ajax 请求作为源数据的 Jquery 自动完成搜索

    我想做的事 我想使用 jquery 自动完成函数创建一个输入文本字段 该函数从跨域curl 请求获取源数据 结果应该与此示例完全相同 CSS 在这里并不重要 http abload de img jquerydblf5 png http a

随机推荐

  • 没有发送过期标头,缓存内容,浏览器发出条件 GET 请求需要多长时间?

    假设浏览器默认设置 并且发送的内容没有过期标头 用户访问网站 浏览器缓存图像等 用户没有关闭浏览器或刷新页面 用户继续正常浏览网站 假设浏览器不会出于任何原因转储缓存 当用户浏览时 浏览器会缓存图像等 但尚不清楚何时会发出条件 GET 请求
  • Git:取消交互式变基

    我喜欢git rebase i HEAD 5压缩我的承诺 有时我认为我需要返回 5 次提交 但后来意识到我需要 7 次 然而 git 已经调出了 rebase 编辑器 git rebase merge git rebase todo在维姆中
  • Play框架中的异常处理

    我正在使用 play 框架 2 3 x 来构建一个宁静的 API 今天 我在 API 控制器中的所有 api 函数周围有一个 try catch 块 以便能够捕获异常并返回通用的 错误 json 对象 Example def someApi
  • 通过perl脚本在linux中按密码提示登录

    我想通过 Perl 脚本传递密码 我基本上是在编写一个脚本来在 Linux 终端上执行命令 在执行特定命令时 我收到提示 Password I need to enter password here through my script 但是
  • 确定最后单击的项目

    我需要检索导致焦点移出 模糊 事件的 DOM 元素在模糊事件中 以下代码将为我提供失去焦点的元素的 ID 而不是导致该元素失去焦点的元素 这是我需要的第二个元素 live blur function e var id this attr i
  • 在Python中使用循环来命名变量[重复]

    这个问题在这里已经有答案了 如何使用循环来命名变量 例如 如果我想要一个变量double 1 2 double 2 4一直到double 12 24 我该怎么写呢 我感觉它会是这样的 for x in range 1 13 double x
  • jQuery 搜索过滤器 - 在输入框中搜索

    我正在使用 jQuery 搜索过滤器 它运行良好 不过 我还需要在输入框中进行搜索和过滤 输入框都是文本类型 我需要像其他表列中的文本一样使用该值 我创造了一个小提琴 http jsfiddle net ktcle Jf6q5 http j
  • JPA @ManyToOne 在删除最后一个子项时自动删除父项

    我有一个由 ManyToOne 从子级到父级的单向映射 如下所示 ManyToOne JoinColumn name PARENT ID private ParentEntity parent 当最后一个子实体被删除而没有从 ParentE
  • 存储过程未在另一个存储过程中执行

    我发现执行 SP1 时 SP2 不会从 SP1 内执行 SP1的结构如下 ALTER PROCEDURE SP1 AS BEGIN Declare c1 cursor open c1 fetch next from c1 while fet
  • 将多个参数传递给线程函数

    我有一个名为 workForThread 的函数 它接受两个参数 并返回 void 我想使用类似的方法来线程化这个函数 thread workForThread a b Where a and b属于适当的类型 上面的代码无法编译 给出 调
  • Visual Studio 2010 数据比较自动化

    我注意到在高级版数据菜单中带有数据比较选项 它可以满足我需要的一切 只是想知道是否有一种方法可以自动执行我的应用程序中 GUI 中的操作 理想情况下 我想获得不同 左 右行的集合 在这篇博客中 我将引导您了解 Data NewDataCom
  • 使用独特的 bean 进行 spring 自动装配:Spring 期望单个匹配的 bean,但发现了 2 个

    我正在尝试使用 Spring 自动装配一些 bean 用于依赖注入 作为 web 应用程序 一个控制器 bean 包含另一个 bean 而另一个 bean 又保存另一组 bean 的哈希图 目前该地图只有一个条目 当我在 tomcat 中运
  • Apache Solr 中的多对一映射

    我正在使用 Solr 来索引我的报告数据库 报告可以包含文本 提交者信息等 当前的工作原理如下 docs Text Some Report Text ReportId 1 Date 2013 08 09T14 59 28 147Z Subm
  • 当用户未登录时,Servlet 过滤器在无限重定向循环中运行

    我有两个 HTML 文件 登录 html 测试 html 我的要求是用户不应该能够访问 test html 除非他通过 login html 成功登录 这是我的login html 文件
  • 快速 (< n^2) 聚类算法

    我有 100 万个 5 维点 需要将它们分组为 k 个簇 其中 k 但 我需要运行时间远低于 n 2 n log n 左右应该没问题 我进行此聚类的原因是为了避免计算所有 n 个点的距离矩阵 这需要 n 2 时间或多个小时 而是我只想计算聚
  • Linq-to-Entity 查询的动态谓词

    以下 Linq to Entities 查询工作正常 var query repository Where r gt r YearProp1 HasValue r YearProp1 gt minYear r YearProp1 lt ma
  • 使用实体框架删除项目

    我正在尝试使用实体框架删除一个对象 在互联网上的所有教程中 我发现为了做到这一点 您必须调用DeleteObject方法结合上下文 我尝试这样做 但似乎我没有DeleteObject方法 这是我的代码 public void DeleteB
  • 选择子网格中的行会选择父网格中具有相同行索引的行

    我已经在 Rowexpander 插件中实现了嵌套网格 现在的问题是 当我选择子网格的任何第 n 行时 父网格第 n 行也会被选中 我认为因为两者都有相同的 rowIndex 即使当我将鼠标悬停在子网格行上时 父级也会同时显示相同的鼠标悬停
  • cpp中的接口

    我想在 cpp 中创建接口 这样任何类都实现该类 那么该类必须实现父类的函数 如果所有功能都没有实现 那么它一定会显示错误 class parent interface class public virtual void display c
  • socket.io,动态添加消息处理程序

    我很高兴编写了一个node js 服务器 它使用socket io 与客户端通信 这一切都运作良好 socket on connection 处理程序有点大 这让我想到了另一种组织代码并将处理程序添加到生成器函数中的方法 如下所示 sess