- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序使用几种不同的机制与设备进行通信,例如串行(即USB CDC/虚拟COM端口)和TCP(即telnet),并且我尝试以更高的方式封装/隐藏/抽象此功能-level 接口(interface),以便使用这些接口(interface)的代码的其他部分不关心正在使用哪种机制。
在本例中,我有 serial.js
和 tcp.js
,它们各自导出一个名为 connect
的函数,该函数返回一个带有 on: function() { ... }
属性,我想要将其连接到其内部 EventEmitter
实例。 (我认为我不应该公开整个对象,因为这可能允许其他代码调用发出并产生难以调试的问题。)
让我困惑的是,如果我只是返回 { on: emitter.on }
那么回调似乎永远不会被调用,但是如果我返回 { on: function(a, b ) { return 发射器.on(a,b); }
它工作正常。我觉得这与闭包/作用域或符号发射器解析的时间有关,但这与我之前遇到的有关这些主题的其他问题不同。有人可以帮助我理解这里发生的事情使这两行相似的代码如此不同吗?
"use strict";
const net = require('net');
const EventEmitter = require('events');
const ConnectionEventNames = require('./events.js');
function connect(settings) {
// ... (validates settings) ...
const emitter = new EventEmitter();
const socket = net.connect({
host: settings.host,
port: settings.port
}, () => {
emitter.emit(ConnectionEventNames.connected);
});
socket.on('data', (data) => {
emitter.emit(ConnectionEventNames.received_data, data);
});
socket.on('error', (error) => {
emitter.emit(ConnectionEventNames.error, error);
});
socket.on('end', () => {
emitter.emit(ConnectionEventNames.disconnected);
});
socket.setNoDelay(settings.setNoDelay);
return {
// FIXME: why didn't this work the way I initially wrote it? (next line)
on_original: emitter.on,
on: function(eventName, listener) {
return emitter.on(eventName, listener);
},
// ...
};
}
module.exports = {
connect
};
最佳答案
像这样传递实例的原型(prototype)函数时的问题是上下文丢失。 emitter.on
并未隐式绑定(bind)到 emitter
,它只是一个普通函数。如果没有 emitter
上下文,.on()
实现中的 this
将不会指向您所期望的内容。
通常情况下,您会很快看到异常抛出,因为大多数原型(prototype)函数通常会假定有效的上下文,因此尝试访问 this
上的特定属性,但是 EventEmitter
有点特殊之处在于它检查是否缺少内部属性并在缺少时创建它们。因此,它将在您执行函数的任何上下文(全局或其他)上创建这些属性。
关于javascript - 为什么在传递/公开 EventEmitter 的 on 函数时需要包装它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35946806/
我已经尝试了很长时间自己解决这个问题,但找不到适合我的问题的解决方案。 我有这个方法: handle_database = function(callback, req, res) { pool.ge
我差点把问题标题写成 - Communicating between eventEmitters 我有一个全局范围内的 node.js 模块 (X)(它使用 eventEmitter)。然后我有每个套
我正在尝试从一个 EventEmitter 发射到另一个 EventEmitter,或者寻找替代解决方案。下面的代码不起作用。 多发射器示例 var events = require('events'
有很多示例在自定义事件发射器构造函数中未使用 events.EventEmitter.call(this),而其他示例正在使用它 (official documentation): var event
假设我有这段代码: export class ProductsListComponent { @Output() onProductSelected: EventEmitter; constr
有时我们会遇到泛型变量应该被省略的情况。像这样: @Component( ... ) class MyComponent { @Output() public cancel = new Eve
我想做这样的事情: var events = require("events"); var emitterA = new events.EventEmitter(); var emitterB = n
EventEmitter.emit() 和 EventEmitter.next() 有什么区别?两者都将事件分派(dispatch)给订阅的监听器。 export class MyService {
我是 angular2 的新手,我对使用 EmitterService 的 EventEmitter 感到困惑,任何人都可以向我解释 Emitter 的用途。 在不使用@input 和@output
我正在学习 Node.js,对自定义 EventEmitter 有一些困惑。代码如下: var events = require("events"); function MyEmitter (name
如标题所述,我想用 TypeScript 重写下面的语句 EventEmitter = require('events').EventEmitter ES6风格 import {EventEmitte
obj.prototype.__proto__ = events.EventEmitter.prototype 我有时会看到上面的代码,我用谷歌搜索了一下,他们说这一行将所有 EventEmitter
我创建了一个抽象父类(super class)来处理我应用中各种表单组件的通用因素。 出于某种原因,我无法正确捕获由在父类(super class)中声明了 EventEmitter 的派生类发出的事
我尝试将表单从我的子组件传递给他的父组件。 child TS: @Output() submit: EventEmitter = new EventEmitter(); updateStream():
这真的很奇怪,也很难解释。 我用过EventEmitter在我的一些服务中,我一直在使用它来更改我的 View 数据。 我遇到了更改路线(通过链接或通过历史返回)的问题,它似乎被多次触发,因此它搞乱了
我正在开发一个 Angular2 组件,它使用网络摄像头将图片捕捉到 Canvas 元素,并将其提取为 Blob。 Blob 和事件分别正常工作,但是当我尝试从 toBlob 的回调函数内发出事件时,
当我有一个带有选择器'recursive-element'的模板时,它的模板看起来像这样 在我定义的类中 greetEvent = new EventEmitter
我非常喜欢将函数导出为 JavaScript 模块的主要 API 的模式。原因是在 JS 中,函数基本上可以做典型对象可以做的任何事情,然后再做一些。 所以这对我来说很典型: function stu
我有这个 Node js脚本: var EventEmitter = require('events').EventEmitter, util = require('util'); var p
在事件生成后附加事件处理程序有一个看似众所周知的问题。这主要是在调用遵循返回 EventEmitter 模式的函数时出现的问题,例如: var EventEmitter = require('even
我是一名优秀的程序员,十分优秀!