【问题标题】:Node.js setting 'this' when running a functionNode.js 在运行函数时设置“this”
【发布时间】:2013-04-17 18:48:26
【问题描述】:

我正在 Node.js 中创建一个具有导出类函数构造函数的模块。我在该类中添加了 2 个原型函数,但我也有一堆独立的函数。

我在类内部用作事件和回调处理程序的普通函数。我不想将这些函数作为类原型的一部分公开。

在独立函数的链接中,我想引用构建模块的主类,以便我可以发出事件(我使用了util.inherits(myclassconsructor, EventEmitter))。但是在我的内部函数中this 是不正确的。我尝试为名为 self 的模块创建一个全局变量,并将 self = this 作为构造函数的第一行。

然后我检查了如果我做了self.on("message name", function() {console.log("worked")});,它确实有效。

然后我转到构建相关模块的主模块并创建上述模块并绑定到同一事件。我没有收到模块外的事件...

模块 A

var self;
function A() {
  self = this;
  self.on('message name', function() { console.log('test') }); // Firing
  doStuff();
}
function doStuff() {
  api.callApi(callback);
}
function callback() {
  self.emit('message name');
}

模块 B

var a = new A();
a.on('message name', domystuff);  // Not firing
function domystuff() {
  console.log('my stuff');
}

发现这个线程似乎是我遇到的问题,但我无法重现结果。 node.js eventEmitter + http.request

【问题讨论】:

    标签: javascript node.js eventemitter


    【解决方案1】:

    如果我理解正确,您想使用:

    doStuff.call(this);
    

    相反。 call 函数将调用它所调用的函数,并将this 设置为第一个参数。

    请参阅Mozilla MDN 的文档

    至于你的回调问题,我可能很想像这样重组你的代码......

    var inst = this;
    api.callApi(function(p1,p2,p3) { inst.emit('message name',p1,p2,p3); });
    

    但还有一些更优雅的方法。

    【讨论】:

    • 我想知道该怎么做!我仍然有一个问题,因为我的回调有结果的上下文。例如我的api.callApi(callback);mysqlConnection.query("select * from tablex", callback); 我会给你一个+1,但我是新的......
    • 对不起,示例不完整。我的代码太大了,无法共享,如果没有我的外部服务器,模拟我正在使用的连接需要付出很多努力。有什么建议如何分享大量代码?
    • JSFiddle 非常适合共享代码。投票给我的答案会很棒,但是在您获得声誉之前,您不能。您仍然可以接受答案! :-)
    • 看了另一双眼睛后,我发现我的问题是我忘记导出我的消息名称。在我的模块 B 中,我正在做:var module = require('module'); var a = new module.A(); a.on(module.EVENT_NAME, callback); 正在寻找艰难的答案!它在模块 A 中有效,因为 EVENT_NAME 有上下文,但在模块 B 中却没有,因为我忘记了 exports.EVENT_NAME... 抱歉浪费了任何人的时间。在一个简单的问题上花了很长时间!
    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多